Genel Bakış
X-Content-Type-Options HTTP yanıt başlığı, tarayıcılara MIME türü koklama işlemi yapmamaları talimatını verir. MIME türü koklama; tarayıcının bildirilen Content-Type başlığına güvenmek yerine yanıt içeriğini inceleyerek türü tahmin etme pratiğidir. Bu başlık mevcut olmadığında veya nosniff değerine ayarlanmadığında, bazı tarayıcılar sunucunun bildirdiği içerik türünü geçersiz kılarak yanıtı farklı ve potansiyel olarak çalıştırılabilir bir tür olarak yorumlayabilir. Bu başlık, WHATWG Fetch Living Standard kapsamında tanımlanmıştır ve tüm büyük modern tarayıcılar tarafından desteklenmektedir.
Sensagraph, taranan tüm HTTP yanıtlarında bu başlığın eksikliğini otomatik olarak tespit eder.
Nasıl çalışır?
MIME koklama, yanlış yapılandırılmış veya eksik Content-Type başlığına sahip sunucuları ele almak için tanıtılmış bir tarayıcı sezgisel yöntemidir. Tarayıcı, bildirilen türe kesinlikle güvenmek yerine yanıt gövdesinin ilk birkaç baytını ("sihirli baytlar") okur ve gerçek içerik türünü belirlemeye çalışır. Bu yaklaşım uyumluluğu artırsa da güvenlik riski oluşturur:
- Komut dosyası olmayan kaynaklardan betik çalıştırma: Bir saldırgan JavaScript içeren bir dosyayı (örneğin bir resim veya CSV) yükleyebilirse ve sunucu bunu betik dışı bir MIME türüyle sunuyorsa, bazı tarayıcılar
nosniffkoruması olmadan bunu<script>etiketi içinde başvurulduğunda betik olarak çalıştırabilir. - Siteler arası betik çalıştırma (XSS) kolaylaştırma:
nosniffolmayan eski tarayıcı sürümlerinde, HTML/JS içeren bir JSON veya metin kaynağı HTML olarak oluşturularak XSS saldırılarına zemin hazırlayabilir. - Stil sayfası enjeksiyonu: Benzer biçimde, düz metin olarak sunulan kaynaklar CSS olarak yorumlanabilir ve CSS tabanlı veri sızdırma veya arayüz değiştirme (UI redressing) saldırılarına olanak tanıyabilir.
- Saldırı ön koşulları: Suistimal genellikle kullanıcı denetimindeki içeriğin (dosya yükleme, enjeksiyon noktası) istismar edilebilir bir bağlamda içeriği dahil eden bir sayfaya ulaşmasını ya da çapraz kaynaklı okumaya izin veren bir CORS yanlış yapılandırmasını gerektirir.
X-Content-Type-Options: nosniff başlığı mevcut olduğunda, bunu destekleyen tarayıcılar (Chrome, Firefox, Edge, Safari 16+), MIME türünün kaynak bağlamı için beklenen türle eşleşmediği durumlarda istekleri engeller (örneğin, text/plain ile sunulan bir yanıtın betik olarak yüklenmesini engeller).
İş etkisi
Tek başına değerlendirildiğinde, eksik başlık düşük önem dereceli bir bulgudur. Ancak aşağıdaki yollarla daha yüksek önem dereceli saldırı zincirlerine katkıda bulunabilir:
- Siteler arası betik çalıştırma (XSS): İçerik koklama, kullanıcı denetimindeki yüklemeler veya enjeksiyon noktalarıyla zincirlenebilir ve kurbanın tarayıcısında rastgele JavaScript çalıştırılmasına, oturum ele geçirme, kimlik bilgisi hırsızlığı veya yetkisiz eylemlere yol açabilir.
- Veri sızdırma: Koklanan stil sayfaları aracılığıyla yapılan CSS enjeksiyonu, hassas sayfa içeriğini karakter karakter sızdırmak için kullanılabilir.
- Uyumluluk riski: PCI DSS, HIPAA ve ISO 27001 güvenlik incelemeleri, eksik güvenlik başlıklarını yaygın olarak işaretler.
nosniffeksikliği denetim bulgularında yer alabilir. - İtibar ve güven: Güvenlik tarayıcıları ve tarayıcı geliştirici araçları bu eksikliği açıkça işaretler; bu durum güvenlik bilincine sahip kullanıcılar ve iş ortakları arasındaki güveni zedeleyebilir.
Nasıl düzeltilir?
- Başlığı genel olarak ekleyin: Web sunucunuzu, CDN'inizi veya uygulama çerçevenizi tüm HTTP yanıtlarına
X-Content-Type-Options: nosniffekleyecek şekilde yapılandırın. Bu, spesifikasyon tarafından tanımlanan tek geçerli değerdir. - Apache:
httpd.confveya.htaccessdosyanızaHeader always set X-Content-Type-Options "nosniff"satırını ekleyin (mod_headersgerektirir). - Nginx:
serverveyalocationbloğunuzaadd_header X-Content-Type-Options "nosniff" always;satırını ekleyin. - IIS: IIS Yöneticisi veya
web.configaracılığıylaX-Content-Type-Optionsadlı venosniffdeğerli özel bir HTTP yanıt başlığı ekleyin. - Uygulama çerçeveleri: Express.js'de
helmetara yazılımını (helmet.noSniff()) kullanın. Django'daSECURE_CONTENT_TYPE_NOSNIFF = Trueayarlayın. ASP.NET Core'daNWebSecpaketindenapp.UseXContentTypeOptions()kullanın veya yanıt ardışık düzeninde yapılandırın. - Doğru MIME türleri sunun: Başlıktan bağımsız olarak, tüm kaynakların doğru
Content-Typedeğerleriyle sunulduğundan emin olun. Bu, tarayıcının koklama motivasyonunu azaltır ve genel doğruluğu artırır. - Dağıtımı doğrulayın: Düzeltmeyi uyguladıktan sonra, tarayıcı geliştirici araçlarını veya
curl -I https://alanadi.comgibi bir aracı kullanarak HTTP yanıt başlıklarını inceleyin ve hata sayfaları ile API uç noktaları dahil tüm ilgili yanıtlarda başlığın mevcut olduğunu doğrulayın.
Referanslar
- MDN Web Docs – X-Content-Type-Options
- WHATWG Fetch Living Standard – X-Content-Type-Options
- OWASP Secure Headers Project – X-Content-Type-Options
- MITRE CWE-693: Koruma Mekanizması Başarısızlığı
- OWASP Top 10 2021 – A05: Güvenlik Yanlış Yapılandırması
- RFC 9110 – HTTP Semantiği (IETF)
- Helmet.js – Node.js için HTTP güvenlik başlıkları ara yazılımı