Yapay zekâ destekli kodlama araçları, geliştiricinin yerine terminalde komut çalıştırıyor. Çoğu araç bunu yapmadan önce izin istiyor. Güvenlik şirketi Apiiro’nun 5 Kasım 2026’da duyurduğu araştırma, Anthropic’in Claude Code aracındaki “Evet ve bir daha sorma” seçeneğinin sessiz bir yan etkisini ortaya koydu: Onaylanan komut, içine yazılmış parola ya da anahtarla birlikte projedeki .claude/settings.local.json dosyasına kaydedilebiliyor. Bu dosya GitHub’a ulaştığında sır da herkese açık hâle geliyor. The Hacker News’in 7 Kasım tarihli haberine göre Apiiro, herkese açık 1.122 kopyada en az bir gizli bilgi buldu.
Bu sızıntıyı 30 saniyede izleyin:
Bulgu bir saldırı değil, bir ihtimal tespiti: Araştırmacılar bulunan sırların çalışıp çalışmadığını denemedi. Yine de uyarıldığı kuruluşlardan biri anahtarının canlı olduğunu doğruladı. Yani sorun teorik değil, ama her satırı ihlal sayılmaz.
Kısaca
- Taranan: GitHub’daki 103.617 depoda 104.185 herkese açık
settings.local.jsonkopyası. Veriler 1–3 Kasım’da toplandı. - Bulgu: 1.122 dosyada (yaklaşık yüzde 1,1) en az bir gizli bilgi; toplam 1.379 farklı sır.
- Geniş kapsam: Eski sürümler, ekiplerin bilerek paylaştığı
settings.jsonve kayıtlı sohbet dökümleri eklenince 1.994 depoda 2.539 sır. Sahipler arasında 63 kuruluş var; çoğu yazılım şirketi. - Türler: 379 veritabanı parolası, 43 sunucu SSH girişi, 42 GitHub/GitLab/npm jetonu, 23 AWS anahtarı.
- Önemli not: Apiiro sırların geçerliliğini sınamadı; veriler şirketin kendi bulgusu, bağımsız biçimde yinelenmiş değil.
Sır dosyaya nasıl düşüyor?
Claude Code varsayılan olarak çoğu kabuk komutunu çalıştırmadan önce sorar. Kullanıcı “Evet ve bir daha sorma” derse, bu karar projenin Git deposunun kökündeki .claude/settings.local.json dosyasına bir “izin kuralı” olarak yazılır. Anthropic’in izinler belgesi, bu onayın bir Bash komutu için “depo ve komut bazında kalıcı” olduğunu söylüyor.
Kural bazen bir kalıp (örneğin npm test *), bazen de tek bir tam komut oluyor. Tam komut olduğunda, komutun içine yazılmış parola ya da jeton da düz metin olarak kaydediliyor. Araştırmacıların örnekleri tanıdık: komut satırında PGPASSWORD= ile verilen veritabanı parolası, sshpass -p ile verilen SSH parolası, curl çağrılarındaki taşıyıcı jetonlar. Geliştirici yapay zekâdan “şu veritabanına neden bağlanamıyoruz?” diye sormuş, araç yapılandırma dosyasındaki parolayla bir komut önermiş, geliştirici de kalıcı onay vermiş olabilir. Parola artık izin listesinde duruyor.
Apiiro bunun modelin değil, aracın davranışı olduğunu vurguluyor ve en yeni modellerle de yeniden üretebildiğini söylüyor. İncelenen 16 kodlama aracının belgelerinde, onaylanan tam komutu varsayılan olarak proje dosyasına yazanın yalnızca Claude Code olduğu belirtiliyor.
“Zaten Git dışında tutuluyor” savunması neden yetmiyor?
Anthropic’in belgesine göre Claude Code, dosyayı bir depoda ilk yazdığında onu kullanıcının genel Git hariç tutma listesine ekliyor. Bu, o bilgisayardaki Git’in dosyayı her depoda yok saymasını sağlıyor. Ama Apiiro’nun işaret ettiği gibi bu koruma tek kullanıcının tek bilgisayarında kalıyor. Dosya daha önce depoya eklenmişse işe yaramıyor; projenin kendi .gitignore dosyasına da bir satır eklenmediği için başka bir geliştiricinin makinesinde ya da başka bir araçta koruma yok.
Araştırmacılar, izlediklerinin bir kısmında (1.105 depodan 539’unda) dosyayı değiştiren işlemde Claude’un ortak yazar olarak göründüğünü, bunun da aracın dosyayı kendi commit’lediğine işaret edebileceğini söylüyor. Ancak bu, her sızan kimlik bilgisini aracın GitHub’a gönderdiği anlamına gelmiyor.
Dosyayı silmek yetmiyor
Sızıntının en sinsi tarafı kalıcılığı. Dosya silinse bile Git geçmişinde duruyor: Apiiro, güncel kopyalarda artık bulunmayan ama eski sürümlerde yer alan 734 ek sır buldu. Depo çatallandığında (fork) sırlar da kopyalanıyor; araştırmaya göre 74 depoya ait 211 çatal aynı sırları taşıyor. The Hacker News’in aktardığına göre sır içeren her dosya, inceleme tarihinde hâlâ deponun varsayılan dalındaydı ve depoların yarısında en az 217 gündür orada duruyordu.
Sırları tarayan yaygın araçlar da sorunu yakalayamıyor. Araştırmacıların sınadığı gitleaks sır içeren 1.122 dosyanın 564’ünü, TruffleHog 643’ünü işaretledi; 215 dosyayı ikisi de kaçırdı. Çünkü bu tarayıcılar bilinen anahtar biçimlerini arıyor; komut satırında -p bayrağından sonra gelen sıradan bir kelime, sıradan bir komut gibi görünüyor.
Türkiye açısı
Türkiye’de çalışan yazılım ekipleri ve serbest geliştiriciler de aynı araçları kullanıyor; kamu ya da müşteri verisine bağlanan veritabanı parolasını bir komutun içine yazmak sık görülen bir alışkanlık. Bir müşterinin kişisel verisine erişim sağlayan parola herkese açık bir depoda kalırsa, bu yalnızca teknik bir kusur olmuyor. 6698 sayılı KVKK’nın 12. maddesi veri sorumlusuna ve veri işleyene uygun güvenlik düzeyini sağlama yükümlülüğü getiriyor; kişisel verilerin hukuka aykırı biçimde başkalarınca ele geçirilmesi durumunda ise kuruma ve ilgili kişilere “en kısa sürede” bildirim gerekiyor. Kurumun uygulamadaki bildirim süresi 72 saat. Dolayısıyla bir sır sızdığında yapılacak ilk iş, parolayı yenilemek ve kullanım günlüklerinde yetkisiz erişim izi aramak olmalı.
Benzer bir ders, bir hafta önce Northflank ihlalinde de görüldü: Ortam değişkenlerinde duran sırlar bir kez ele geçince, bunlarla açılan kapılar günlerce kullanılabiliyor. İki olayın ortak mesajı, sırların kod, komut ve bulut paneli arasında dağılmadan yönetilmesi gerektiği.
Geliştiriciler ne yapmalı?
Araştırmacıların önerileri açık ve uygulaması kolay. Sıra önemli: önce yenileyin, sonra temizleyin.
- Önce sırları yenileyin: Bu dosyalarda (eski sürümler dahil) görünmüş her parola, jeton ve anahtarı iptal edip yenisini oluşturun. Dosyayı silmek eski değeri geçersiz kılmaz.
- Kendi depolarınızı arayın: Kuruluşunuzun GitHub hesabında
.claude/settings.local.jsonve.claude/settings.jsondosyalarını, Git geçmişi dahil, tarayın. - Dosyayı takipten çıkarın:
git rm --cached .claude/settings.local.jsonile izlemeyi bırakın ve dosyayı deponun kendi.gitignoredosyasına ekleyin. - Kendi bilgisayarınızdaki dosyayı da açın: Hiç commit’lenmemiş olsa bile içinde sır geçen izin kurallarını silin. Dosya düz JSON; bir npm paketine, Docker imajına, zip arşivine ya da eşitlenen bir klasöre kazara girebilir.
- Sırları komuta yazmayın: Parolayı
$DB_URLgibi bir değişken adıyla verin; kaydedilen kural sırrı değil değişken adını tutar. Parolaları bir sır yönetim aracında saklayın. - Tek komut yerine kalıp onaylayın: Belirli bir komutu kalıcı onaylamak yerine
Bash(npm run:*)gibi dar kalıplar kullanın.
Güvenlik ekipleri için öneriler de var: .claude/, .cursor/, .gemini/ gibi ajan klasörlerini ve ajan bellek dosyalarını .env dosyaları gibi sır içerebilecek yerler olarak ele alın; bunları commit öncesi ve sürekli entegrasyon taramalarına, Git geçmişi dahil, ekleyin ve tarayıcınızın komut içindeki parolaları da yakaladığından emin olun. Önce herkese açık bir sunucu adresiyle eşleşen kimlik bilgilerini kontrol edin; erişimi gerçekten bunlar sağlıyor.
Neyi bilmiyoruz?
Apiiro bulduğu sırların kaçının hâlâ geçerli olduğunu ölçmedi. Araştırma bir güvenlik ürünü satan şirketin kendi çalışması ve bağımsız biçimde tekrarlanmış değil. Haberlerde rakamlar farklı kapsamlara işaret ediyor: 1.122, yalnızca güncel yerel dosya kopyalarını; 2.539 ise eski sürümleri, paylaşılan ayar dosyasını ve sohbet kayıtlarını da içeren genişletilmiş sayıyı gösteriyor. The Hacker News ayrıca, aynı davranışı bildiren daha önceki hata raporlarının otomatik bir bot tarafından “planlanmadı” diye kapatıldığını ve araştırmacıların bunlara Anthropic’ten yanıt almadığını aktarıyor. Biz Anthropic’in bu bulguya yönelik bir açıklama yapıp yapmadığını doğrulayamadık.
Asıl ders, yapay zekâ ajanlarının “kolaylık” için tuttuğu her kaydın bir güvenlik yüzeyi olduğu. Onay kutusu rahatlatıyor, ama arkasında düz metin bir dosya var ve o dosya sizin elinizde olmayabilir.