Genel Bakış
Content-Security-Policy (CSP), W3C tarafından standartlaştırılmış bir HTTP yanıt başlığıdır ve tarayıcılara bir belgenin hangi kaynaklardan betik, stil, görsel, çerçeve ve diğer kaynakları yükleyip yürütebileceğini kısıtlamalarını bildirir. Başlık olmadığında tarayıcı, ek kısıtlama içermeyen izin verici same-origin politikasına geri döner ve uygulamayı XSS gibi içerik enjeksiyonu saldırılarına karşı ikinci bir savunma katmanından yoksun bırakır.
Eksik bir CSP başlığı doğrudan bir güvenlik açığı oluşturmaz; ancak kritik bir hafifletme kontrolünü ortadan kaldırır. Uygulamada bir XSS veya HTML enjeksiyon zafiyeti bulunduğunda, CSP yokluğu enjekte edilen betiklerin tarayıcı düzeyinde herhangi bir müdahale olmaksızın çalışmasına olanak tanır. Sensagraph, eksik ve yanlış yapılandırılmış CSP başlıklarını sürekli HTTP güvenlik başlığı kontrolleriyle otomatik olarak tespit eder.
Nasıl Çalışır
Content-Security-Policy başlığı (veya eşdeğer <meta http-equiv> etiketi) olmadığında tarayıcılar yalnızca varsayılan same-origin kurallarını uygular. Yansıtılmış, depolanmış veya DOM tabanlı XSS yoluyla sayfaya içerik enjekte edebilen bir saldırgan, hiçbir politika script-src kısıtlaması tanımlamadığından veya satır içi betikleri engellemediğinden keyfi JavaScript çalıştırabilir.
- Satır içi betik yürütme: Hiçbir CSP
'unsafe-inline'kullanımını yasaklamadığında, tarayıcılar<script>...</script>bloklarını ve olay işleyici niteliklerini (onclick,onerrorvb.) serbestçe çalıştırır. - Rastgele harici betik yükleme: Bir
script-srcyönergesi olmadan, sayfalar herhangi bir kaynaktan betik yükleyebilir; bu da saldırganların denetimindeki CDN'lerden veya alan adlarından zararlı yük getirmesine olanak tanır. connect-srcyokluğuyla veri sızdırma:connect-srcyönergesi olmadan enjekte edilen kod, çalınan oturum belirteçlerini veya kimlik bilgilerini harici uç noktalara özgürce iletebilir.- Eklenti ve nesne yükleme:
object-src 'none'olmadan, eski eklenti içerikleri (Flash, Java uygulamaları) enjekte edilebilir; ancak bu modern tarayıcılarda artık daha az geçerlidir. - Tıklama tuzağını kolaylaştırma: CSP'nin
frame-ancestorsyönergesi, çerçevelemeyi kontrole alan modern yaklaşımdır; bu yönergenin yokluğu (eksikX-Frame-Optionsbaşlığıyla birlikte) tıklama tuzağı saldırılarını mümkün kılar.
İş Etkisi
Eksik CSP'nin pratik riski, uygulamanın hassasiyetine ve başka enjeksiyon zafiyetlerinin bulunup bulunmadığına göre değişir:
- Oturum ele geçirme: Enjekte edilen betikler,
HttpOnlybayrağı olmayan oturum çerezlerini ve kimlik doğrulama belirteçlerini çalarak hesap ele geçirilmesine yol açabilir. - Kimlik bilgisi hırsızlığı: DOM manipülasyonu, URL'de görünür bir değişiklik olmaksızın sahte giriş formları bindirebilir veya kullanıcıları kimlik avı sayfalarına yönlendirebilir.
- Veri sızdırma: Hassas kişisel veriler, finansal bilgiler veya dahili API yanıtları saldırgan altyapısına sessizce iletilebilir.
- Kötü amaçlı yazılım dağıtımı: Ele geçirilmiş sayfalar, ziyaretçilere sürücü indirme saldırıları sunarak yasal ve itibarsal yükümlülük doğurabilir.
- Mevzuat riski: Mevcut teknik kontrollerin uygulanmaması, GDPR Madde 32 (uygun teknik tedbirler), PCI DSS Gereksinim 6.4 ve benzer çerçeveler kapsamında ihlal teşkil edebilir.
Nasıl Düzeltilir
- Yalnızca raporlama modundaki bir politikayla başlayın: İşlevselliği bozmadan ihlalleri toplamak için izin verici bir temel ve bir
report-uriveyareport-touç noktasıylaContent-Security-Policy-Report-Onlydağıtın. Politikayı uygulamaya koymadan önce tüm meşru kaynak kaynaklarını belirlemek için raporları analiz edin. - Katı bir temel politika tanımlayın: En azından şunları içeren bir politika kullanın:
default-src 'self'; script-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self';. Yönergeleri yalnızca doğrulanmış üçüncü taraf kaynakları için genişletin. - Satır içi betik ve stilleri kaldırın: Tüm satır içi JavaScript'i harici dosyalara taşıyın. Satır içi betikler kaçınılmazsa
'unsafe-inline'yerine'nonce-{rastgele}'veya'sha256-{hash}'kullanın. Her yanıt için kriptografik olarak rastgele bir nonce üretin. 'unsafe-eval'kullanmaktan kaçının: Bu yönergeye olan ihtiyacı ortadan kaldırmak içineval(),Function()veya benzer dinamik kod yürütmeye dayanan kodları yeniden düzenleyin.- Fetch yönergelerini kilitleyun: Uygulamanızın meşru olarak kullandığı tüm kaynaklar için
script-src,style-src,img-src,font-src,connect-src,media-src,frame-srcveworker-srcyönergelerini açıkça belirtin. upgrade-insecure-requestsekleyin: Karma içerik kaynaklarının otomatik olarak HTTPS üzerinden yüklenmesini sağlamak için bu yönergeyi ekleyin.- Uygulamaya geçiş yapın: Politika doğrulandıktan ve ihlaller stabilleştikten sonra
Content-Security-Policy-Report-OnlyyerineContent-Security-Policy'e geçin. - Başlığı web sunucusu veya CDN katmanında sunun: Başlığı Nginx (
add_header), Apache (Header always set) veya CDN'inizin yanıt başlığı kurallarında yapılandırarak tüm yanıtlarda bulunmasını sağlayın. - Düzenli olarak gözden geçirin ve güncelleyin: CSP politikaları, bağımlılıklar ve üçüncü taraf entegrasyonlar değiştikçe bakım gerektirir. CSP incelemesini dağıtım sürecinize dahil edin.
Referanslar
- W3C – Content Security Policy Seviye 3 Spesifikasyonu
- MDN Web Docs – Content Security Policy (CSP)
- OWASP – Güvenli Başlıklar Projesi
- OWASP – Content Security Policy
- MITRE CWE-693 – Koruma Mekanizması Başarısızlığı
- Google – Katı CSP
- MDN Web Docs – Content-Security-Policy Başlık Referansı
- OWASP Top 10 – A05:2021 Güvenlik Yanlış Yapılandırması