DeepSeek Harness, yalnızca HTTP Host başlığını 127.0.0.1 olarak değiştirerek, kum havuzu (sandboxed) içindeki bir saldırganın rastgele komutlar çalıştırmasına izin verdi; bu açık CVSS ölçeğinde 9.4 puan alıyor. Bu kusur, tek bir yanlış güven kararının koruyucu bir sınırı nasıl açık bir arka kapıya dönüştürebileceğini gösteriyor.
Hata nasıl sızdı
Savunmasız kod, isteğin Host başlığını okuyan ve eğer değer loopback adresiyle eşleşiyorsa isteği yerel makineden geliyormuş gibi kabul eden tek bir fonksiyon içinde yer alıyor.
Kum havuzu içinde kod yürütebilen bir saldırganın karmaşık bir payload'a ihtiyacı yoktur. Host: 127.0.0.1 içeren tek bir HTTP isteği göndererek, backend çağrının doğrudan ana makineden geldiğine inanır; böylece tüm güvenlik uyarılarını, hız sınırlama (rate-limit) kontrollerini ve komut doğrulama adımlarını atlar. Sonuç: başka hiçbir etkileşime gerek kalmadan kısıtlanmamış komut yürütme.
Başlıklara güvenmek neden tehlikelidir?
Başlıklar, çağırıcı tarafından sağlanan düz metin dizeleridir. Alanın adı Host, X-Forwarded-For veya herhangi bir özel isim olsun, istemci bunu istediği herhangi bir değere ayarlayabilir. Bir bağlantının gerçekten nereden geldiğine dair tek güvenilir gerçeklik kaynağı taşıma katmanıdır (transport layer) – yani işletim sisteminin TCP el sıkışması tamamlandığında kaydettiği soketin kaynak IP adresidir.
Bir uygulama, bilinen ve doğru yapılandırılmış bir proxy tarafından enjekte edildiğini doğrulamadan bir başlığa güvenmeye karar verdiğinde, saldırgana krallığın anahtarlarını teslim etmiş olur. DeepSeek Harness hatası, bu yanlış adımın ders kitabı niteliğinde bir örneğidir.
Gerçek dünya etkisi: shell.online örneği
Web tabanlı bir terminal sunan açık kaynaklı shell.online projesi, yakın zamanda aynı tuzağı belgeledi. Proje, TRUST_PROXY adlı bir yapılandırma bayrağı kullanıyor:
- TRUST_PROXY = 0 – uygulama X-Forwarded-For başlığını görmezden gelir ve soketin uzak adresine güvenir. Bu, bir istemcinin hız sınırlarından kaçmak veya güvenilir bir kullanıcı gibi görünmek için IP adresi sahteciliği yapmasını engeller.
- TRUST_PROXY = 1 – uygulama, istemcinin kimliği olarak X-Forwarded-For başlığına güvenir. Eğer servis, bu başlığı temizleyen (sanitize eden) gerçek bir proxy'nin arkasında değilse, bir saldırgan her istekte yeni bir IP adresi sağlayarak IP başına uygulanan hız sınırlamasını (throttling) etkili bir şekilde sıfırlayabilir.
DeepSeek hatası bu senaryoyu yansıtır: Kod, sanki bir proxy tarafından ayarlanmış gibi Host başlığına güvendi, ancak servise doğrudan erişilebiliyordu.
Geliştiricilerin şimdi yapması gerekenler
- İstemci tarafından sağlanan başlıkları okuduğunuz her yeri denetleyin. Hangi başlıkları yetkili (örneğin Host, X-Forwarded-For, X-Real-IP) olarak kabul ettiğinizi belirleyin ve güvenilir bir proxy'nin, bu başlıklar uygulamanıza ulaşmadan önce onları yeniden yazacağından emin olun.
- Mümkün olduğunca güvenlik kararlarını soket adresine bağlayın. Kimlik doğrulama, hız sınırlama ve erişim kontrolü denetimleri için işletim sistemi tarafından sağlanan kaynak IP'yi kullanın.
- Proxy güven bayraklarını (proxy-trust flags) yalnızca servisin önünde doğru yapılandırılmış bir ters proxy (reverse proxy) olduğunda etkinleştirin. Uygulamayı doğrudan çalıştırıyorsanız, bu bayrakları devre dışı bırakın.
- Gerekli dağıtım topolojisini (deployment topology) projenizin README dosyasında veya dağıtım kılavuzunda belgeleyin; böylece kendi sunucusunda barındıran (self-host) kullanıcılar proxy güven gereksiniminden haberdar olur.
- Yanında proxy doğrulama mantığı bulunmayan, güvenlik kararları için başlıkların doğrudan kullanımını işaretleyen statik analiz veya kod inceleme araçları çalıştırın.
Bundan sonra neye dikkat edilmeli?
Kendi sunucularında barındırılan web servisleri sunan toplulukların, bu olaydan sonra kendi proxy güven ayarlarını gözden geçirmeleri muhtemeldir.
Temel ders oldukça nettir: İnternetteki herhangi birinin yazabileceği bir metin parçasının, sisteminizin güvenlik duruşunu belirlemesine asla izin vermeyin. İstek katmanına (request layer) değil, ağ katmanına (network layer) güvenin.
