Yapay zekâ ile kodundaki güvenlik açıklarını bulmak için önce hızlı ve tutarlı tarayıcıları (sırlar, bağımlılıklar, statik kurallar) çalıştır, sonra bir kodlama ajanına her seferinde tek bir açık sınıfı ver ve güvenilmeyen girdinin kodunda nasıl dolaştığını izlemesini iste. Her bulguyu doğrulanacak bir iddia olarak gör, regresyon testiyle düzelt ve bu süreç boyunca ajanı gerçek sırlardan uzak tut.
Bu rehber kendi kodunu savunma amaçlı denetlemekle ilgili. Ajanın kendisinin zarar vermesini (prompt enjeksiyonu, yıkıcı komutlar, kötü amaçlı MCP sunucuları) nasıl önleyeceğini merak ediyorsan önce yapay zekâ kodlama ajanı güvenliği yazısını oku; bu yazı o önlemlerin alındığını varsayıyor. Aşağıdaki araç adları ve komutlar Ekim 2026 itibarıyla resmi belgelere dayanıyor.
Yapay zekâ denetimi neyi iyi yapar, neyi yapmaz
Statik tarayıcılar ve kodlama ajanları farklı hatalar bulur; ikisini birden istemenin nedeni bu.
| Tutarlı tarayıcılar | Kodlama ajanı | |
|---|---|---|
| Güçlü yanı | Bilinen kalıplar, bilinen açıklı paket sürümleri, sır biçimleri | Mantık: bu rotayı kim çağırabilir, bu değer nereden geliyor, hangi kontrol unutulmuş |
| Zayıf yanı | İş mantığını kaçırır; güvenli kalıplarda gürültülüdür | Yanlış alarmlar, kaçan sorunlar, her çalıştırmada farklı cevaplar |
| Maliyet | Saniyeler, tekrarlanabilir | Token, daha yavaş, tekrarlanamaz |
| En iyi kullanım | Her değişiklikte CI kapısı | Riskli alanların ve yeni kodun hedefli denetimi |
Bir ajan, örneğin giriş yapıp yapmadığını kontrol eden ama okuduğun siparişin sana ait olup olmadığını hiç kontrol etmeyen bir uç noktada parlar. Bunu hiçbir regex göremez. Öte yandan lock dosyandaki lodash paketinin üç yıllık olduğunu ajan güvenilir biçimde fark etmez; npm audit eder.
İkisinin de yapmadığı şey: çalışan sistemini test etmek. Ajan çalışma kopyandaki kaynak kodu okur. Yanlış yapılandırılmış bulut depolama, bir güvenlik duvarı kuralı ya da bir sohbet kaydında sızmış token onun görüş alanının dışındadır.
Başlamadan önce: güvenli bir kurulum
Güvenlik denetimi çoğunlukla okuma işidir; kurulumu da öyle yap.
- Bir dalda ya da bir git worktree içinde çalış. Denetim ve düzeltmeler kolay incelenip kolay atılabilmeli.
- Salt okunur başla. Claude Code’da denetimin kendisi için plan modunu kullan (Shift+Tab ya da
/plan); Codex’te/permissions→ Read Only ya da--sandbox read-only. Düzenlemeye yalnızca düzeltirken geç. - Sırları erişimin dışında tut. Anahtarları, token’ları ya da
.enviçeriğini asla bir prompt’a yapıştırma. Ajanın bir değişkenin var olduğunu bilmesi gerekiyorsa adı yeterli. Okuması gereken şey sahte değerli bir.env.example. - Geliştirme kimlik bilgileri kullan. Ajan testlerini çalıştırıyorsa bu testler atılabilir anahtarlarla yerel ya da staging bir veritabanına bağlanmalı, asla üretime değil.
1. Adım: tutarlı tarayıcıları çalıştır
Bunlar saniyeler sürer ve ajana somut ipuçları verir. Hepsi yerelde ücretsiz çalışır.
# Secrets in git history and in the working tree (gitleaks v8.19+)
gitleaks git -v .
gitleaks dir -v .
# Known-vulnerable dependencies
npm audit --audit-level=high
pip-audit -r requirements.txt
# Static analysis rules for your languages
semgrep scan --config auto
Resmi belgelerden birkaç not:
- gitleaks v8.19.0’da eski
detectkomutunugit(commit’leri tarar) vedir(dosyaları tarar) olarak ikiye ayırdı; eski komutlar hâlâ çalışıyor ama yardım çıktısında gizli. - npm audit’te
--audit-levelraporu değil yalnızca çıkış kodunu değiştirir.npm audit fixgerçek bir kurulum yapar;npm audit fix --forceSemVer-major güncellemeler kurabilir, gözü kapalı çalıştırma. - pip-audit argümansız çalışınca mevcut Python ortamını denetler;
-rbir requirements dosyasını denetler. - Semgrep’te
--config autoprojene uygun kuralları Semgrep Registry’den çeker, bu yüzden ağ erişimi gerekir. Bulgu olduğunda 1 ile çıkması için--errorekle; CI’da istediğin budur.
Çıktıyı bir dosyaya kaydet. 3. adımda yeniden yazmak yerine onu ajana vereceksin.
2. Adım: her seferinde tek bir açık sınıfını denetle
“Bu depodaki güvenlik hatalarını bul” sana yüzeysel bir liste getirir. Her sınıf için odaklı bir prompt gerçek bir analiz getirir. OWASP Top 10:2025 iyi bir harita; tipik bir web uygulamasında önce denetlenmeye değer sınıflar şunlar:
| Sınıf | Ajandan neyi izlemesini iste | Tipik işaret |
|---|---|---|
| Bozuk erişim kontrolü | Bir kaydı okuyan ya da değiştiren her rota: kaydın çağırana ait olduğunu kontrol ediyor mu? | Sahip ya da kiracı filtresi olmadan findById(req.params.id) |
| Enjeksiyon (SQL, shell, XSS) | Kullanıcı girdisinin bir sorguya, shell komutuna ya da HTML’e ulaştığı her yer | SQL’e string birleştirme, girdiyle exec, ham HTML çıktısı |
| Kimlik doğrulama hataları | Giriş, oturum, parola sıfırlama ve token işleme | Hiç süresi dolmayan sıfırlama token’ları, girişte hız sınırı yok |
| SSRF | URL’si kullanıcıdan gelen her sunucu tarafı istek | İzin listesi olmadan fetch(req.body.url) |
| Depodaki sırlar | Koda gömülü anahtarlar, yapılandırmadaki token’lar, testlerdeki kimlik bilgileri | Anahtara benzeyen string’ler; gitleaks daha güvenilir olur |
| Tedarik zinciri | Bağımlılıklar, kurulum betikleri, CI iş akışı izinleri | Sabitlenmemiş action’lar, iş akışlarında geniş permissions: |
Plan modunda işe yarayan bir prompt:
Bu depoyu bozuk erişim kontrolü açısından denetle. Dosya düzenleme.
1. Bir kaydı ID ile okuyan, güncelleyen ya da silen her HTTP rotasını listele.
2. Her biri için çağıranın kimliğinin nereden geldiğini ve sorgunun
çağıranın sahip olduğu kayıtlarla (kullanıcı ya da kiracı) sınırlanıp
sınırlanmadığını bul.
3. Yalnızca eksik kontrolü gösterebildiğin rotaları raporla.
Her bulgu için şunları ver: dosya:satır, rota, ID'nin nereden geldiği,
mevcut middleware'in bunu neden kapsamadığı ve bir önem derecesi
(yüksek/orta/düşük). Emin değilsen tahmin etmek yerine bunu söyle.
Aynı kalıbı enjeksiyon, kimlik doğrulama ve SSRF için tekrarla. Konuşma başına tek sınıf, bağlam penceresini odaklı tutar; bunları ayrı oturumlarda paralel çalıştırabilirsin.
Enjeksiyonda, her sorguyu işaretlemesin diye ajana senin yığınında “güvenli”nin neye benzediğini söylemek işe yarar:
Her yerde db.query(sql, params) üzerinden parametreli sorgu kullanıyoruz.
İstek verisinden SQL, shell komutu ya da HTML üreten ve bunu db.query
parametreleri, argüman dizisiyle execFile ya da şablon motorunun
kaçışlaması üzerinden yapmayan her yeri bul. tests/ altındaki kodu yok say.
3. Adım: yerleşik güvenlik incelemelerini kullan
Artık birçok ajan, kendin yazmak zorunda olmadığın bir güvenlik incelemesiyle geliyor.
Claude Code /security-review. Resmi komut başvurusu bunu mevcut dalındaki değişiklikleri güvenlik açıkları açısından analiz etmek olarak tanımlıyor: dalınla origin’in varsayılan dalı arasındaki farkı inceler ve enjeksiyon, kimlik doğrulama sorunları ve veri sızıntısı gibi risklere bakar. Bir origin uzak deposu gerekir. Yalnızca dalının değişikliklerini kapsar; bu yüzden pull request açmadan önce çalıştır. Anthropic’in claude-code-security-review deposu nasıl özelleştireceğini anlatıyor: oradaki security-review.md dosyasını .claude/commands/ içine kopyala ve kendi kurallarını ekle; örneğin kod tabanında hangi kalıpların güvenli olduğunu.
Claude Code security-guidance eklentisi. /plugin install security-guidance@claude-plugins-official ile kurulur ve Claude kod yazarken inceleme yapar: her düzenlemede bir kalıp kontrolü (eval(, child_process.exec, .innerHTML = gibi), her turun farkının arka planda güvenlik incelemesi ve Claude commit attığında daha derin bir inceleme. Proje kurallarını .claude/claude-security-guidance.md içine ekleyebilirsin. Belgeler açık: yazmayı engellemez ve sorunları kaçırabilir; yalnızca bir katmandır.
Codex /review. Codex’in inceleme komutu (ve kabuktan codex review --uncommitted ya da --base main) genel bir kod incelemesidir. İstediğin buysa açıkça güvenliğe odaklanmasını söyle.
Gemini CLI security eklentisi. gemini extensions install https://github.com/gemini-cli-extensions/security ile kurulur; dalındaki değişiklikler için /security:analyze ve bağımlılıkları OSV-Scanner ile kontrol eden /security:scan-deps komutlarını ekler.
Bir dalın değişiklikleri yerine zaten var olan kod için 2. adımdaki sınıf sınıf prompt’ları kullan. Tarayıcı çıktısını da verebilirsin:
semgrep ve npm audit çıktısı scan-results.txt dosyasında.
Her bulgu için bu kod tabanında kullanıcı girdisinden ulaşılabilir
olup olmadığını kontrol et. Her birini doğrulandı, muhtemelen yanlış
alarm ya da insan bakmalı olarak tek satırlık gerekçeyle işaretle.
Dosya düzenleme.
4. Adım: gerçek bulguları yanlış alarmlardan ayır
Yapay zekâ güvenlik incelemeleri haklı da olsa haksız da olsa kendinden emin konuşur. Hüküm değil kanıt iste:
- Kaynak: güvenilmeyen değer nereden giriyor? İstek gövdesi, sorgu dizesi, dosya yükleme, webhook?
- Yol: riskli çağrıya ulaşana kadar hangi fonksiyonlardan geçiyor? Her adım için dosya:satır ile zinciri iste.
- Koruma: bu yolda hangi doğrulama, kaçışlama ya da yetkilendirme var ve bu durumu neden kapsamıyor?
- Ulaşılabilirlik: rota dışarıya açık mı? Kullanılmayan bir yönetici betiğindeki bulgu, herkese açık bir API’deki bulguyla aynı değildir.
Sonra ikinci bir görüş al. Kimse düzeltme yazmadan önce yeni bir oturum, daha iyisi farklı bir model yüksek önemdeki bulguları kontrol etmeli. İlk ajanın akıl yürütmesini değil, bulguyu ve kodu ver; yoksa sadece onaylar. Yapay zekâ kod incelemesi yazısı bulguları nasıl tartacağını ve bu döngüyü nasıl sınırlı tutacağını anlatıyor.
Bekleyebileceğin yaygın yanlış alarmlar: yalnızca sabitlerden kurulan SQL, framework’ün otomatik kaçışlamasından geçen HTML, sahte anahtarlı test verileri ve sabit bir iç URL’ye giden sunucu tarafı istekler. Güvenli kalıpları CLAUDE.md ya da AGENTS.md dosyasına yaz ki sonraki denetimler onları işaretlemeyi bıraksın.
5. Adım: regresyon testiyle düzelt
Testsiz bir güvenlik düzeltmesi geri gelme eğilimindedir. Önce testi iste:
GET /api/orders/:id içindeki eksik sahiplik kontrolünü düzelt (bulgu #2).
1. Önce A kullanıcısının B kullanıcısının siparişini istediği ve 404
beklediğin bir test yaz. Çalıştır ve başarısız olduğunu göster.
2. Sonra kontrolü mevcut middleware'imize uyan en küçük biçimde ekle.
İlgisiz kodu değiştirme.
3. Tüm test paketini çalıştır ve bana farkı göster.
Önce başarısız olup sonra geçen test, hatanın var olduğunu ve düzeltmenin onu kapsadığını kanıtlar. Her düzeltmeyi açık bir mesajla kendi commit’inde tut ki geçmiş neyin yanlış olduğunu anlatsın. Önce test yazarak düzeltme alışkanlığı için yapay zekâ ile hata ayıklamak yazısına bak.
Aynı disiplin bağımlılık bulguları için de geçerli: paketleri tek tek yükselt, testleri çalıştır, kırıcı değişiklikler için değişiklik günlüğünü oku. Toplu bir npm audit fix --force, denetimi kesintiye çeviren yoldur.
Depoda gerçek bir sır bulursan
Adımların sırasının önemli olduğu tek durum bu:
- Önce sırrı yenile. Anahtarı sağlayıcıda iptal et ve yenisini oluştur. Bir sır bir kez push’landıysa ele geçirildiğini varsay; dosyayı silmek sızıntıyı geri almaz.
- Yeni sırrı koda değil, sır yöneticine ya da ortam değişkenlerine koy.
- Sonra temizle: koddan kaldır ve geçmişi yeniden yazıp yazmayacağına ekibinle karar ver. Anahtar yenilenmediyse geçmişi yeniden yazmak işe yaramaz.
- Bir sonrakini önle: bir pre-commit hook ile. gitleaks şu
.pre-commit-config.yamlgirdisini belgeliyor:
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.24.2
hooks:
- id: gitleaks
2–4. adımlarda ajandan yardım al, ama asla sırrı konuşmaya yapıştırarak değil. “src/config.ts içindeki Stripe anahtarı STRIPE_SECRET_KEY adlı bir ortam değişkenine taşınmalı” demen yeterli.
Sürekli hâle getir
Tek seferlik bir denetim, yeni kod geldiği anda eskir. Tutarlı kontrolleri CI’a koy, yapay zekâ incelemesini pull request’lere bırak:
# .github/workflows/security.yml (excerpt)
- run: npm audit --audit-level=high
- run: semgrep scan --config auto --error
Her pull request’te bir yapay zekâ geçişi için Anthropic’in anthropics/claude-code-security-review GitHub Action’ı bulguları PR’a yorum olarak yazar. Zorunlu girdisi claude-api-key; isteğe bağlı girdiler arasında comment-pr, exclude-directories ve false-positive-filtering-instructions var. Claude’u zaten GitHub Actions’ta çalıştırıyorsan Claude Code GitHub Actions yazısı kurulumu ve sırların yönetimini anlatıyor.
AgentVera ile yapmak
AgentVera; Claude Code, Codex, Gemini CLI ve diğer CLI ajanlarını gerçek terminallerde yan yana çalıştıran macOS, Windows ve Linux masaüstü uygulaması. Güvenlik denetimleri için bazı düzenleri kolaylaştırıyor:
- Çalışma alanı: her izni sana soran salt okunur bir denetçiyi bir worktree’de çalışan düzelticinin yanına koy; üçüncü bölmede farklı bir CLI ikinci görüş olsun. Her ajan kendi izin seviyesini korur.
- Kod incelemesi: proje ayarlarında tur sonu incelemeyi aç; seçtiğin bir Claude modeli düzelticinin değişikliklerini inceler. Bulgular önem derecesi ve dosya:satır bağlantısıyla gelir, art arda en fazla iki tur ajana geri gönderilebilir.
- İnceleme kutusu: biten işler kart olarak bekler, riskli değişiklikler işaretlenir: kimlik doğrulama ve güvenlik kodu, bağımlılık dosyaları, CI ve altyapı dosyaları,
.envve testsiz değişiklikler. - Verify (Pro ve Team): ayrı, salt okunur bir doğrulayıcı sonucu isteğindeki ölçütlere göre kontrol eder; örneğin “bir regresyon testi var ve düzeltme olmadan başarısız oluyor”.
- Docker kapsayıcısında ajan: Claude Code ya da Codex’i yalnızca proje klasörünü gören bir kapsayıcıda çalıştır; denetim sırasında makinendeki diğer dosyalar ve SSH anahtarları erişim dışında kalsın.
- Turlar ve oturum tekrarı: her turun anlık görüntüsü alınır; ters giden bir düzeltmeyi tek tıkla geri alırsın.
Izgara, worktree’ler, kod incelemesi ve Docker ajanları ücretsiz planda. AgentVera’yı indir ve ilk denetimini bir dalda çalıştır.
Sık yapılan hatalar
- “Tüm güvenlik sorunlarını” bir kerede istemek. Genel bir kontrol listesi alırsın. Her seferinde tek sınıf denetle.
- Doğrulamadan düzeltmek. “Düzeltilmiş” bir yanlış alarm, kimsenin anlamadığı kod ekler. Önce kanıt al.
- “Geçerli mi diye” sırları yapıştırmak. Asla. Bunun yerine yenile.
- Bir ajan döngüsünde
npm audit fix --forceçalıştırmak. Major yükseltmeler, ilgisiz görünen yerleri kırar. - Temiz bir yapay zekâ incelemesini garanti saymak. Bu, ajanın bu sefer bir şey bulmadığı anlamına gelir. Tarayıcıları CI’da tut.
- Denetçinin düzenleme yapmasına izin vermek. Denetimi salt okunur, düzeltmeleri ayrı ve incelenen bir adımda tut.
Toparlarsak
gitleaks, bağımlılık denetleyicin ve Semgrep ile başla. Sonra salt okunur bir ajanla her seferinde tek bir OWASP sınıfını denetle; dosya:satır kanıtı ve ulaşılabilir bir yol iste. Her pull request’ten önce /security-review (ya da ajanının eşdeğerini) çalıştır, ciddi bulguları ikinci bir oturuma kontrol ettir ve her birini önce başarısız olan bir regresyon testiyle düzelt. Bir sır sızarsa her şeyden önce onu yenile. Düzeltmeler için ajanları işe koşmaya hazır olduğunda yapay zekâ ile eşli programlama yazısı yön veren koltukta nasıl kalacağını gösteriyor. Bu işlere yeniysen yapay zekâ ile kodlama öğrenmek daha yumuşak bir başlangıç.