Apiiro: Claude Code'un "bir daha sorma" izin dosyası GitHub'da 1.122 depoda parola ve anahtar taşıyor
Apiiro araştırmasına göre Claude Code'da onaylanan komutların kaydedildiği .claude/settings.local.json dosyası, komuta gömülü parola ve token'ları düz metin olarak saklıyor; herkese açık GitHub depolarında 1.122 kopyada en az bir gizli bilgi bulundu.
Yazılım güvenliği şirketi Apiiro, Anthropic'in kodlama ajanı Claude Code'da sık kullanılan bir onay seçeneğinin gizli bilgilerin herkese açık depolara sızmasına yol açtığını bildirdi. Geliştirici bir shell komutunu "Yes, and don't ask again" ile onayladığında, araç bu komut için bir izin kuralını proje klasöründeki .claude/settings.local.json dosyasına yazıyor. Kural tam komutu içeriyorsa ve komutta parola ya da token varsa, bu bilgi dosyada düz metin olarak kalıyor.
The Hacker News'in 7 Kasım'da aktardığı araştırmaya göre Apiiro, GitHub'da bu dosyanın 103.617 depoya dağılmış 104.185 kopyasını taradı. 1.122 kopyada en az bir gizli bilgi, toplamda 1.379 farklı secret bulundu. Eski commit'ler, fork'lar, ekipçe paylaşılan .claude/settings.json ve kaydedilmiş ajan sohbet günlükleri de sayıldığında toplam 1.994 depoda 2.539 gizli bilgiye ulaşıldı.
Neler açıkta?
Araştırmacıların sınıflandırmasına göre gizli bilgilerin üçte birinden fazlası doğrudan veritabanı erişimi sağlıyor (379 veritabanı parolası). Bunları herkese açık sunuculara ait 43 SSH girişi, GitHub, GitLab ve npm için 42 token ile 23 AWS anahtarı izliyor. Sahipleri arasında çoğu yazılım şirketi olmak üzere 63 kurum var. Apiiro anahtarların hâlâ geçerli olup olmadığını test etmediğini, ancak bilgilendirilen bir şirketin anahtarının aktif olduğunu doğruladığını belirtiyor. Bu bilgilerin kötüye kullanılıp kullanılmadığı tespit edilmedi.
Dikkat çeken bir başka bulgu, klasik secret tarayıcılarının bir kısmını kaçırması: gizli bilgi içeren dosyaların 215'ini ne gitleaks ne de TruffleHog işaretledi. Kaçanların çoğu, komutun içine yazılmış ve bilinen bir anahtar biçimine benzemeyen parolalar.
Neden git'e giriyor?
Claude Code belgelerine göre bu dosya yalnızca yerel kullanım içindir ve araç dosyayı oluştururken git'in onu yok saymasını sağlar. Apiiro'ya göre bu ayar kullanıcının makinesindeki genel git exclude listesiyle yapılıyor; projenin kendi .gitignore dosyasına eklenmiyor ve daha önce commit edilmiş dosyayı korumuyor. İzlenen 1.105 deponun 539'unda dosyayı değiştiren commit'te Claude'un ortak yazar olarak görünmesi, dosyanın sıklıkla ajan tarafından commit edildiğine işaret ediyor. Habere göre aynı davranışı anlatan önceki hata kayıtları otomatik olarak kapatılmış; Anthropic'ten yayın anına kadar bir yanıt aktarılmadı.
Ne yapılmalı?
- GitHub organizasyonunuzda
.claude/settings.local.jsonve.claude/settings.jsondosyalarını arayın; dosya silinmiş olsa bile git geçmişini ve fork'ları da kontrol edin. - Bu dosyalarda geçmiş her parola, token ve anahtarı temizlikten önce yenileyin (rotate); geçmişten silmek, ele geçirilmiş bir bilgiyi geçersiz kılmaz.
- Yerel dosyayı repodan çıkarıp proje
.gitignoredosyasına ekleyin; kurum.gitignoreşablonlarına da bu yolu koyun. - Komutlara parola yazmak yerine secret manager'dan gelen ortam değişkenlerini kullanın; tek tek tam komut yerine komut kalıplarını onaylayın.
.claude/,.cursor/gibi ajan klasörlerini.envgibi gizli bilgi taşıyan alanlar olarak ele alın; pre-commit ve CI secret taramasına ekleyin ve komut içi parolaları yakalayacak kurallar yazın.
Kendi makinenizde hangi projelerde bu dosyanın bulunduğunu ve içinde parola benzeri ifade olup olmadığını salt okunur olarak görebilirsiniz:
find ~ -path "*/.claude/settings.local.json"
grep -n -i -E "password|passwd|token|sshpass|PGPASSWORD" .claude/settings.local.json