Açıkta kalan .git dizini: göz önünde saklanan kaynak kodu sızıntısı
Bir web sunucusu .git dizinini uygulama dosyalarıyla birlikte sunduğunda, saldırgan tüm kaynak kodunu yeniden oluşturmaya yetecek kadar object indirebilir — sonraki bir commit'te kaldırılmış olsa bile şimdiye kadar commit'lenmiş her secret dahil. AppSafe bunu kritik olarak işaretler.
Nedir
Git, deponun tamamını — her dosyayı, her commit'i, her branch'in ucunu — proje kökündeki gizli .git dizininde saklar. Bu dizin web root'un içine düşerse ve sunucun erişimi engellemezse, /.git/config, /.git/HEAD ve /.git/objects/ altındaki object deposu herkese açık şekilde indirilebilir hale gelir.
Sızan bir .git dizininden tüm kaynak kodunu yeniden oluşturmak oldukça kolaydır. git-dumper gibi araçlar önce index'i çeker, ardından referans verilen her object'i indirerek tamamen çalışan bir checkout üretir. Saldırganların shell erişimine ihtiyacı yoktur — bir tarayıcı yeterlidir.
Neden önemli
Kaynak kodun neredeyse kesinlikle riski artıran bilgiler içerir: hardcode edilmiş API key'leri (genellikle eski commit'lerde), veritabanı şemaları, dahili endpoint yolları, iş mantığı ve kimlik doğrulama akışları. Şu anda commit'lenmiş hiçbir secret olmasa bile geçmiş, saldırganların istismar edebileceği malzemeyle doludur.
Git geçmişi tasarım gereği kalıcıdır. Yıllar önce commit'lenip sonra kaldırılan bir secret hâlâ object deposunda yaşar ve diğer her şeyle birlikte indirilir. Onu etkisiz hale getirmenin tek yolu rotate etmektir.
Nasıl düzeltilir
Yolu /.git/ ile başlayan tüm istekleri reddet. Dizinin var olduğunu doğrulamamak için 403 yerine 404 döndür.
location ~ /\.git {
deny all;
return 404;
}En güvenilir çözüm, .git dizinini en başından document root'a hiç deploy etmemektir. Build'ini, derlenmiş çıktının ayrı bir public/ dizinine gideceği şekilde yapılandır ve proje kökünü değil yalnızca bu dizini deploy et.
Düzeltmeyi deploy ettikten sonra tarayıcıda https://yourdomain.com/.git/config adresini iste. Git yapılandırmanın içeriğini değil, 404 döndürmelidir. AppSafe bunu her taramada yeniden kontrol eder.
Dizin erişilebilir durumdaysa, herhangi bir commit'te yer almış her API key'ini, parolayı ve token'ı ele geçirilmiş kabul et. Hepsini rotate et — commit'i kaldırmak yeterli değildir, çünkü object, saldırganın zaten indirmiş olabileceği pack dosyalarında hâlâ mevcuttur.
SSS
Yönetilen bir platforma (Vercel, Netlify, Fly.io) deploy ediyorum — risk altında mıyım?
Kaynaktan build alan yönetilen platformlar genellikle yalnızca build çıktısını deploy eder, bu yüzden .git dizini sunulmaz. Risk; VPS deployment'larında, proje kökünden build edilen Docker container'larında veya tüm çalışma ağacının kopyalandığı statik site export'larında daha yüksektir.
AppSafe tam olarak neyi kontrol ediyor?
AppSafe /.git/config ve /.git/HEAD adreslerini ister ve yanıt gövdesinin gerçek bir Git dosyasına benzeyip benzemediğini kontrol eder ([core] veya ref: kalıplarıyla eşleşme). Git içeriği olmayan genel bir 200 sayfası işaretlenmez.
Sunucudaki .git dizinini silebilir miyim?
Evet, uygulamanın çalışması için yalnızca deploy edilen dosyalara ihtiyacın varsa. Ancak deployment sürecinin bir sonraki push'ta onu geri kopyalamadığından emin ol. Web sunucusu seviyesinde engellemek, deployment script'lerinin tutarsız olduğu durumlar için ek bir güvence katmanıdır.
Uygulaman etkileniyor mu?
AppSafe, bunu ve onlarca başka sorunu tek bir ücretsiz taramada kontrol eder.
Uygulamamı ücretsiz taraBlogdan
Sahte yapay zekâ tarayıcıları .env dosyalarının peşinde. Seninkini nasıl kontrol edersin
Kimlik bilgisi tarayıcıları allowlist'leri atlatmak için yapay zekâ tarayıcılarının adlarını ödünç alıyor ve özellikle tek bir dosyayı istiyor: senin .env dosyanı. Seninkinin erişilebilir olup olmadığını nasıl kontrol edersin ve nasıl kilitlersin.
Railway ihlali: uygulamanın secret'larını kesinti olmadan nasıl yenilersin
Saldırganlar yapay zekâ ve platform API key'lerinin peşine düşünce Railway tüm kullanıcılarından ortam değişkenlerini yenilemelerini istedi. Ne kadar açıkta olduğunu nasıl kontrol edersin, uygulamanı çökertmeden her şeyi nasıl yenilersin ve bir sonraki ihlalin daha az canını yakmasını nasıl sağlarsın.
PHP2Shell aktif olarak istismar ediliyor: uygulamanın açıkta olup olmadığını nasıl kontrol edersin
PHP'nin kendisindeki iki kritik hata, birkaç gün içinde "yama yayınlandı"dan "aktif olarak istismar ediliyor"a geçti. Barındırdığın herhangi bir şeyin etkilenen bir sürüm çalıştırıp çalıştırmadığını nasıl anlarsın ve bugün ne yapmalısın.
İlgili rehberler
.env dosyalarının açığa çıkması: saldırganlar secret'larını nasıl bulur
Erişilebilir tek bir .env, tüm stack'ini teslim edebilir.
Production'daki source map'ler kaynak kodunu sızdırır
Yayınlanan .map dosyaları orijinal kaynağını teslim eder.
Açık dizin indeksleri: dosya sunucun her şeyi listelediğinde
İçeriğini listeleyen bir dosya sunucusu, saldırganlara bedava bir envanter sunar.
Açıkta kalan veritabanı yedekleri: /backup.sql erişilebilir olduğunda ne olur
Erişilebilir bir .sql dump'ı, tüm veritabanını eksiksiz teslim etmek demektir.