Claude Code’un yerel ayar dosyası parolaları GitHub’a sızdırıyor

Anasayfa » Claude Code’un yerel ayar dosyası parolaları GitHub’a sızdırıyor
Claude Code’un yerel ayar dosyası parolaları GitHub’a sızdırıyor

Claude Code, onaylanan komutları sırlarla birlikte dosyaya yazabiliyor

Anthropic’in Claude Code kod asistanında “Yes, and don’t ask again” seçeneğiyle onaylanan komutlar, parolaları ve erişim anahtarlarını düz metin halinde proje içindeki .claude/settings.local.json dosyasına yazabiliyor. Yapılan incelemeler, GitHub’da herkese açık 1.122 kopyada en az bir sır bulunduğunu ortaya koydu.

Bu dosya, geliştiricinin tek bir projede kullandığı yerel izinleri saklıyor. Sorun şu ki dosya bir kez repoya girdiyse silinmesi geçmişteki izleri yok etmiyor; eski sürümler Git geçmişinde ve fork’larda yaşamaya devam ediyor. Araştırmacılar, bu yüzden ilk adımın temizleme değil, rotasyon olması gerektiğini söylüyor: dosyanın tuttuğu tüm parola, token ve anahtarlar değiştirilmeden temizlik yapılmamalı.

Anthropic’in izin dokümantasyonuna göre Claude Code, çoğu shell komutunu çalıştırmadan önce kullanıcıya soruyor. Kullanıcı “Yes, and don’t ask again” seçeneğini seçtiğinde sistem, ilgili komut için bir izin kuralını proje kökündeki .claude/settings.local.json dosyasına kalıcı olarak kaydediyor. Aynı komutlar sonraki oturumlarda yeniden sorulmadan çalışıyor.

Buradaki risk, onayın her zaman tek bir kalıp yerine tam komuta verilmesinden doğuyor. Claude Code bazen npm test * gibi bir desen için izin kaydediyor, bazen de birebir tek bir komutu saklıyor. Tek bir komut onaylandığında, içine yazılmış parola ya da token da olduğu gibi dosyaya geçiyor. Araştırmacılar, bunu hem açık GitHub kopyalarında gördüklerini hem de Claude Code’un en güncel modelleri Opus 5.5 ve Fable 5.1 ile aynı davranışı yeniden ürettiklerini belirtti.

Claude Code dosyayı Git dışında tutmaya çalışıyor. Belgelerde yer alan bilgiye göre dosya bir Git deposunda ilk kez yazıldığında, kullanıcıya ait global git excludes listesine ekleniyor ve böylece o bilgisayardaki Git tüm depolarda dosyayı yok sayıyor. Ancak bu koruma yalnızca tek bir makinedeki tek kullanıcının ayarlarına bağlı; dosya daha önce repoya commit edildiyse işe yaramıyor. Üstelik Claude Code, bu dosyayı projenin kendi .gitignore dosyasına otomatik olarak eklemiyor.

İncelenen 1.105 depo içinde, Claude’un ortak yazar olarak göründüğü bir commit ile bu dosyayı değiştiren 539 depo bulundu. Araştırmacılar bunu, Claude Code’un dosyayı çoğu zaman kendisinin de commit ettiği şeklinde yorumluyor.

Yapılan taramaya göre GitHub’da 103.617 depoda toplam 104.185 kopya .claude/settings.local.json dosyası yer aldı. Bunların yaklaşık yüzde 1,1’i, yani 1.122 kopya, en az bir sır içeriyordu. Bu dosyalar birlikte 1.379 ayrı gizli bilgi barındırıyordu. Bir değerin sır sayılması için bilinen bir anahtar formatıyla eşleşmesi ya da bir parola veya token’ın kamuya açık bir sunucu adresinin yanında bulunması gerekiyordu; ayrıca bir yapay zekâ inceleyicinin de bunu onaylaması şarttı. Çalışma, bu sırların fiilen kullanılıp kullanılmadığını söylemiyor.

En büyük bölüm veritabanlarına doğrudan erişim sağlıyor. İnceleme 379 veritabanı parolasını, 43 SSH oturum bilgisini, GitHub, GitLab ve npm için 42 token’ı ve 23 AWS anahtarını ortaya çıkardı. Toplam sırların üçte birinden fazlası veritabanı erişimi açıyor. Dosyaların ait olduğu kuruluş sayısı 63’e ulaşıyor ve bunların çoğu farklı ölçekte yazılım şirketleri. Araştırmacıların öne çıkardığı en güçlü örnekler arasında bir veritabanı sağlayıcısının yönetici düzeyindeki bulut anahtarı ile bir tıbbi kayıt veritabanının sahip parolası bulunuyor.

İncelemeye göre 1.122 dosyanın tamamı pazartesi itibarıyla ilgili depoların varsayılan dalında duruyordu ve bunların yarısında dosya en az 217 gündür aynı yerdeydi. Daha eski sürümler, artık mevcut olmayan ama geçmişte tutulmuş 509 depoda ek 734 sır daha içeriyor. Bu kopyalar çoğunlukla dosya sonradan silindiği için güncel versiyonlarda görünmüyor. Fork’lar da yayılımı artırmış durumda: 74 deponun 211 fork’unda aynı sırlar orijinal kopyalarla birlikte bulunuyor.

Araştırmacılar, paylaşılan .claude/settings.json dosyasının da 76.011 kopyasının 298’inde sır buldu. Bu dosya ekiplerin bilinçli olarak commit ettiği bir dosya; çoğu zaman izin kuralları ve proje ayarları burada tutuluyor. Eski sürümler, paylaşılan ayarlar ve saklanmış ajan sohbet kayıtları da hesaba katıldığında toplam sayı 1.994 depoda 2.539 sıraya çıkıyor. İncelenen 16 kodlama ajanı arasında, belgelerine göre tam onaylanan komutu varsayılan olarak bir proje dosyasına kaydettiği doğrulanan tek araç Claude Code oldu.

Araştırmacılar geliştiricilere, örgüt genelinde .claude/settings.local.json ve .claude/settings.json dosyalarını GitHub’da aramalarını, dosyalar silinmiş olsa bile depo geçmişini kontrol etmelerini öneriyor. İlk yapılacak işin her parola, token ve anahtarı değiştirmek olduğu belirtiliyor. Ardından yerel dosya takibinin git rm --cached .claude/settings.local.json komutuyla kaldırılması ve dosyanın repodaki kendi .gitignore kaydına eklenmesi tavsiye ediliyor.

Aynı dosya, bilgisayarda yalnızca yerel olarak duruyor olsa bile açılıp içindeki sır içeren kuralların temizlenmesi gerekiyor. Komutların içine doğrudan gizli bilgi yazmak yerine, sır yöneticisinden gelen değişken adlarının kullanılması isteniyor; örneğin $DB_URL gibi. Böylece kaydedilen kural, sırrın kendisini değil değişken adını saklıyor. Araştırmacılar, tekil komutlar yerine Bash(npm run:*) benzeri kalıpların onaylanmasını da öneriyor.

GitHub’a hiç ulaşmayan kopyalar da risk taşıyor. Dosya, proje klasöründe düz JSON olarak duruyor ve bir npm paketi, Docker imajı, zip arşivi ya da eşitlenen bir klasör içinde de kalabiliyor. Daha önce zararlı yazılımlar geliştirici makinelerindeki sırları aramıştı; Eylül 2025’te Shai-Hulud worm enfekte bilgisayarlarda TruffleHog sır tarayıcısını çalıştırmış ve tarayıcı dosyaların yarısından fazlasını sır olarak işaretlemişti.

Araştırmacılar gitleaks ve TruffleHog’u her kopya üzerinde, araçların doğrulama adımını çalıştırmadan denedi. Sır içeren 1.122 dosyanın 564’ünü gitleaks, 643’ünü TruffleHog işaretledi; 215 dosyada ise iki araç da alarm üretmedi. Kaçırılan örneklerin çoğu, komutların içine yazılmış parolalardan oluşuyor. Bu tarayıcılar çoğunlukla bilinen anahtar formatlarını aradığı için PGPASSWORD=, sshpass -p veya mysql -p sonrasında gelen parola, sıradan bir komut satırı kelimesi gibi görünebiliyor.

Güvenlik ekipleri için öneriler arasında .claude/, .cursor/, .gemini/ ve .specstory/ gibi ajan klasörlerinin ile ajan bellek dosyalarının, tıpkı .env dosyaları gibi sır taşıyormuş kabul edilmesi yer alıyor. Araştırmacılar bu dizinlerin ön commit ve CI taramalarına eklenmesini, tarayıcının yalnızca bilinen anahtar formatlarını değil, komutların içine yazılmış parolaları da yakalamasını istiyor. Kurumsal .gitignore şablonlarına .claude/settings.local.json eklenmesi ve önce kamuya açık sunucularla eşleşen kimlik bilgilerinin kontrol edilmesi de öneriler arasında.

Konu yeni değil. 11 Ağustos 2025’te açılan bir hata kaydı, API anahtarları ve token içeren onaylı komutların settings.local.json içine olduğu gibi yazıldığını bildirmişti. Kayıt, 60 gün hareketsiz kaldıktan sonra 3 Ocak’ta otomatik bot tarafından “not planned” notuyla kapatıldı. Araştırmacıların atıf yaptığı dört ilgili kayıt da aynı bot tarafından kapatıldı; en yenisi dün kapandı. Araştırmacılar, Anthropic’ten bu kayıtlara herhangi bir yanıt gelmediğini aktardı.

Kaynaklar