- Web’in başlıca açıklarından XSS saldırılarını önlemek için Firefox, standartlaştırılmış Sanitizer API desteğini ilk kez sunuyor
- Mevcut innerHTML yerine setHTML() yöntemi kullanıldığında, güvenilmeyen HTML DOM’a eklenmeden önce otomatik olarak sanitize edilerek kötü amaçlı betikler kaldırılıyor
- Geliştiriciler, varsayılan ayarlar fazla katı ya da yetersiz olduğunda özelleştirilmiş ayarlar ile izin verilecek öğeleri ve öznitelikleri kontrol edebiliyor
- Firefox’taki bu özellik, Trusted Types ile birleşerek web genelinde güvenlik seviyesini yükseltiyor ve geliştiricilerin ayrı bir güvenlik ekibi olmadan da XSS’i önleyebilmesini sağlıyor
XSS açığı ve Firefox’un yanıtı
- Cross-site scripting (XSS), kullanıcı girdili içerik üzerinden saldırganın keyfi HTML veya JavaScript ekleyebilmesi durumunda ortaya çıkar
- Saldırganlar bunu kullanıcı etkileşimlerini izlemek veya verileri çalmak için kullanabilir
- XSS, yaklaşık 10 yıldır en büyük 3 web açığından biri (CWE-79) olarak sınıflandırılıyor
- Firefox, 2009’dan beri Content-Security-Policy (CSP) standardına öncülük ederek XSS savunmasını güçlendiriyor
- CSP, bir web sitesinin yükleyip çalıştırabileceği kaynakları sınırlar
- Ancak mevcut site yapısında değişiklik ve sürekli güvenlik incelemesi gerektirdiğinden geniş çaplı benimsenmesinde sınırlamalar vardı
Sanitizer API ve setHTML()’in rolü
- Sanitizer API, kötü amaçlı HTML’yi zararsız bir biçime dönüştürmek için standartlaştırılmış bir yöntem sunar
- Örnek kodda
<img src="x" onclick="alert('XSS')"> öğesi kaldırılır ve yalnızca <h1>Hello my name is</h1> kalır
- setHTML() yöntemi, HTML ekleme sırasında temizleme sürecini otomatik olarak gerçekleştirerek varsayılan olarak güvenli davranışı garanti eder
- Mevcut
innerHTML atamasını yalnızca setHTML() ile değiştirmek bile güçlü bir XSS savunması sağlayabilir
- Geliştiriciler, varsayılan ayarlar çok katı ya da çok gevşekse, özel ayarlar aracılığıyla izin verilecek HTML öğelerini ve özniteliklerini tanımlayabilir
- Denemeler için Sanitizer API playground aracı kullanılabilir
Trusted Types ile birleşim
- Trusted Types API, HTML ayrıştırma ve eklemeyi merkezi olarak denetleyerek ek bir güvenlik katmanı sağlar
setHTML() kullanılırken Trusted Types politikaları kolayca uygulanabilir
- Sıkı politikalar yalnızca
setHTML() kullanımına izin verip diğer riskli ekleme yöntemlerini engelleyerek gelecekteki XSS regresyonlarını önlemeye katkı sağlar
Firefox 148’in güvenlik iyileştirmesi etkisi
- Firefox 148, hem Sanitizer API hem de Trusted Types desteği sunarak temel güvenlik seviyesini önemli ölçüde yükseltiyor
- Geliştiriciler, karmaşık güvenlik politikaları veya ayrı bir güvenlik ekibi olmadan da yalnızca basit kod değişiklikleriyle XSS’i önleyebilir
- Bu standardın benimsenmesinin, tüm tarayıcılarda daha güvenli bir web ortamının yayılmasına katkı sağlaması bekleniyor
Özet
- Firefox 148, setHTML() yöntemi ve Sanitizer API ile web geliştiricilerinin XSS saldırılarını kolayca engellemesini destekliyor
- Bu özellik, CSP’nin sınırlamalarını tamamlıyor ve varsayılan olarak güvenli HTML ekleme yöntemini web standardı hâline getirmek için bir dönüm noktası oluşturuyor
- Trusted Types ile birleştiğinde uzun vadeli güvenliğin korunması ve XSS regresyonlarının önlenmesi mümkün oluyor
- Sonuç olarak Firefox, güvenliğin varsayılan olduğu bir web ortamına geçişe öncülük ediyor
2 yorum
Ah evet, buna gerçekten ihtiyaç var. Tüm tarayıcılarda desteklenirse bence müthiş olur.
Hacker News görüşleri
Bu tür özellikler her zaman biraz rahatsız edici geliyor
Çünkü kullanıcı girdisini rastgele verince güvenli işleyen metotlarla güvenli olmayan metotlar karışık durumda ve sadece isimlerine bakarak aradaki farkı anlamak zor
İdeal olarak, tehlikeli fonksiyonlar en baştan isimlerinden açıkça belli olmalı
Ayrıca HTML’i “sanitize” etme fikri başlı başına muğlak ve bunun gerçekten güvenli olup olmadığını değerlendirmek zor
Script çalıştırabilen öğe ve öznitelikleri kaldırıyor ve bu mantık tarayıcı motorunun içinde çalıştığı için string tabanlı sanitizer’lardan daha doğru işliyor
Ayrıntılar için MDN setHTML belgesine bakılabilir
elementNode.textContentgüvenilmeyen girdiler için güvenliykenelementNode.innerHTMLdeğilİlki tüm karakterleri escape eder, ikincisi ise hiçbir şeyi escape etmez
“HTML sanitization”ın temelde çözülemez bir problem olduğunu düşünenler de var
İlgili tartışma için bu yoruma bakılabilir
Bu API’lerin öneri aşamasını geçmemesi gerekirdi
innerHTMLilesetHTMLi birlikte kullanmak yerineinnerHTMLi tamamen kaldırıp eski davranış gerekirsesetHTMLUnsafekullanmak şeklinde olmalıydıinnerHTMLgibi eski API’leri genel bir ayarla devre dışı bırakabilse güzel olurduAma o durumda site eski tarayıcılarda çalışmayabilir
Content-Security-Policy: require-trusted-types-for 'script'başlığıyla sunulursa, sanitizer olmayan metotlara normal string geçirilmesi engellenebilirÖrnekteki gibi kullanıcı adına
<h1>ya da<br>gibi etiketler eklenebiliyorsa, script çalıştırmayı engellese bile hâlâ keyfi markup enjeksiyonu mümkün olur<style>etiketiyle CSS de değiştirilebilir; mesela bir PayPal profil sayfasının tasarımı değiştirilebilirİnsan neden böyle bir şeyi istesin diye düşündürüyor
Markdown’dan üretilen HTML’i sanitizer ile bir kez daha sınırlandırıp sadece belirli etiketlere izin vererek ek bir savunma katmanı oluşturulabilir
innerHTMLyerineinnerTextya datextContentkullanılmalıydısetHTML,innerHTMLin yerine geçmesi için varsetHTML()in varsayılan ayarları fazla katı ya da fazla gevşekse, geliştirici izin verilecek HTML öğeleri ve özniteliklerini tanımlayan özel bir yapılandırma sağlayabilirİlgili tartışma için bu başlığa bakılabilir
Sonuç olarak backend tarafında da kullanıcı adı hâlâ standart şekilde sanitize edilmeli ve çıktı verilirken HTML escape uygulanmalı
RFC 2119’a göre bu bir “SHOULD” seviyesinde gerekliliktir
Bu özelliğin gelmesi sevindirici, ama tarayıcı desteğinin yeterince yayılması zaman alacak gibi görünüyor
Destek durumuna Can I use üzerinden bakılabilir
O zamana kadar polyfill kullanılabilir
Başlık biraz sansasyoneldi
Aslında
innerHTMLe vermeden önce girdiyi kontrol eden bir fonksiyonla sanitization uygulanamaz mı diye düşündümAma bu tür girişimler sonuçta tekerleği yeniden icat etmek gibi hissettiriyor
Ayrıca eski Firefox sürümlerinde hacks.mozilla.org hiç açılmıyor ve Pale Moon ya da SeaMonkey’de MDN bozuk görünüyor
Sanki bir “tarayıcı karteli” web’i bozmak istiyor gibi
Parser differential meselesini de hiç hesaba katmıyor
Sanitizer API yanlış kullanılırsa bir footgun olabilir
Özellikle “remove” modu kullanılırken dikkat etmek gerekir
Bence en iyisi sadece
setTextkullanmak ve kullanıcıların hiç HTML eklemesine izin vermemeksetHTMLkullanıldığı sürece XSS ortaya çıkmazinnerHTMLin sık kullanıldığı gerçeğine bakınca bunu tamamen dışlamak zorAğ erişiminin tüm yönlerinin düzgün biçimde kontrol edilmesi ve artık güvenlik zincirinin kod güveninden host yapılandırmasına güvene kaymış olması etkileyici
Varsayılanlar da güvenli seçilmiş
Benim gerçekten istediğim şey, tehlikeli kodu güvenli şekilde çalıştırabilecek bir
<sandbox>öğesiAmaç tehlikeli kodu düzeltmek değil, onu yalıtılmış bir ortamda çalıştırabilmek
iframeDOM ile birlikte akamıyor gibi kısıtlara sahip ve yapay zeka ile dinamik içeriğin arttığı bir dönemde birleştirilebilir kapsülleme gerekiyorsetHTMLUnsafeismini gerçekten beğendimGüvenlik özellikleri geliştiricinin opt-in yapmasına bağlı olduğunda başarısız oluyor
Bunun yerine “tehlikeli yolun tehlikeli hissettirmesi” daha etkili
set_html()adıinner_htmlden çok daha sezgiselJavaScript API’leri gerçekten darmadağın; bir gün toparlanmaları gerekiyor
Bu tartışma güvenliğe odaklanıyor ama yeni API yayımlanırken tasarımın kendisi de temiz olmalı
DOM API’leri eskiden de şimdi de “sanki daha önce hiç API tasarlamamış insanlar yapmış” hissi veriyor
90’lardaki geliştiriciler:
2020’lerdeki geliştiriciler:
90’lardan hiçbir şey öğrenmemişiz