Birçok web uygulamasının, kullanıcı tarafından kontrol edilen içeriği görüntülemesi gerekir. Bu işlem, kullanıcı tarafından yüklenen resimler (örneğin, profil fotoğrafları) sunmak kadar basit veya kullanıcı tarafından kontrol edilen HTML oluşturmak kadar karmaşık (örneğin bir web geliştirme eğitimi) olabilir. Bunu güvenli bir şekilde yapmak her zaman zor olmuştur. Bu nedenle, çoğu web uygulaması türüne uygulanabilecek kolay ancak güvenli çözümler bulmaya çalıştık.
Güvenilir olmayan içerikleri izole etmek için klasik çözümler
Kullanıcı tarafından denetlenen içeriklerin güvenli bir şekilde sunulması için klasik çözüm, korumalı alan alanları olarak bilinen alanları kullanmaktır. Temel fikir, uygulamanızın ana alanı example.com
ise güvenilmeyen tüm içeriği exampleusercontent.com
üzerinden sunabileceğinizdir. Bu iki alan siteler arası olduğundan, exampleusercontent.com
üzerindeki kötü amaçlı içerikler example.com
üzerinde etkili olamaz.
.
Bu yaklaşım; resimler, indirmeler ve HTML de dahil olmak üzere güvenilmeyen her türlü içeriği güvenli bir şekilde sunmak için kullanılabilir. Bunu resimler veya indirmeler için kullanmak gerekli gibi görünmese de, özellikle eski tarayıcılarda içerik algılama risklerinin önlenmesine yardımcı olur.
.
Korumalı alan alanları, sektörde yaygın olarak kullanılmakta ve uzun süredir iyi performans göstermektedir. Ancak, bunların iki önemli dezavantajı vardır:
- Uygulamaların genellikle içerik erişimini tek bir kullanıcıyla sınırlaması, kimlik doğrulama ve yetkilendirmenin uygulanmasını gerektirir. Korumalı alan alanları, çerezleri kasıtlı olarak ana uygulama alan adıyla paylaşmadığından, bunu güvenli bir şekilde gerçekleştirmek çok zordur. Kimlik doğrulamayı desteklemek üzere sitelerin özellik URL'lerini kullanması veya korumalı alan alanı için ayrı kimlik doğrulama çerezleri ayarlaması gerekir. Bu ikinci yöntem, birçok tarayıcının siteler arası çerezleri varsayılan olarak kısıtladığı modern web'de özellikle sorunludur.
- Kullanıcı içeriği ana siteden izole edilmiş olsa da diğer kullanıcı içeriğinden izole edilmez. Bu, kötü amaçlı kullanıcı içeriğinin korumalı alan alanındaki diğer verilere saldırma riskini oluşturur (örneğin, aynı kaynaklı verileri okuyarak).
Ayrıca, kaynaklar izole bir alanda açıkça segmentlere ayrıldığından korumalı alan alanlarının kimlik avı risklerini azaltmaya yardımcı olduğunu da belirtmek isteriz.
Kullanıcı içeriği sunmak için modern çözümler
Web zaman içinde gelişti ve artık güvenilmeyen içerikler sunmanın daha kolay ve daha güvenli yolları var. Burada pek çok farklı yaklaşım olduğundan, şu anda Google'da yaygın olarak kullanılan iki çözümü özetleyeceğiz.
1. Yaklaşım: Etkin olmayan kullanıcı içeriği sunma
Bir sitenin yalnızca etkin olmayan kullanıcı içeriği (resimler ve indirmeler gibi HTML veya JavaScript olmayan içerik) sunması gerekiyorsa bu işlem artık izole bir korumalı alan alanı olmadan güvenli bir şekilde yapılabilir. Burada iki önemli adım vardır:
Content-Type
üstbilgisini her zaman, tüm tarayıcılar tarafından desteklenen ve etkin içerik barındırmayacağı garanti edilen, iyi bilinen bir MIME türüne ayarlayın (şüphelendiği durumlardaapplication/octet-stream
güvenli bir seçimdir).- Ayrıca, tarayıcının yanıtı tam olarak izole ettiğinden emin olmak için her zaman aşağıdaki yanıt başlıklarını ayarlayın.
Yanıt Başlığı | Purpose |
---|---|
X-Content-Type-Options: nosniff |
İçeriklerin algılanmasını engeller |
Content-Disposition: attachment; filename="download" |
Oluşturma yerine indirme işlemini tetikler |
Content-Security-Policy: sandbox |
İçeriği, ayrı bir alan adında yayınlanmış gibi korumalı alana alır |
Content-Security-Policy: default-src ‘none' |
JavaScript yürütmesini (ve alt kaynakların dahil edilmesini) devre dışı bırakır |
Cross-Origin-Resource-Policy: same-site |
Sayfanın siteler arası dahil edilmesini engeller |
Bu üstbilgi kombinasyonu, yanıtın uygulamanız tarafından yalnızca alt kaynak olarak yüklenmesini veya kullanıcı tarafından dosya olarak indirilebilmesini sağlar. Ayrıca başlıklar, CSP korumalı alan başlığı ve default-src
kısıtlaması aracılığıyla tarayıcı hatalarına karşı birden fazla koruma katmanı sağlar. Genel olarak, yukarıda özetlenen kurulum, bu şekilde sunulan yanıtların ekleme veya yalıtım güvenlik açıklarına yol açmayacağı konusunda yüksek derecede güven sağlar.
Derinlemesine savunma
Yukarıdaki çözüm XSS'e karşı genel olarak yeterli bir savunma sağlar, ancak ek güvenlik katmanları sağlamak üzere uygulayabileceğiniz çeşitli ek önlemler vardır:
- IE11 ile uyumluluk için bir
X-Content-Security-Policy: sandbox
üst bilgisi ayarlayın. - Uç noktanın yerleştirilmesini engellemek için bir
Content-Security-Policy: frame-ancestors 'none'
üstbilgisi ayarlayın. - Yalıtılmış bir alt alan adında kullanıcı içeriğini korumalı alana almak için:
- Yalıtılmış bir alt alan adında kullanıcı içeriği sunma (ör. Google,
product.usercontent.google.com
gibi alanları kullanır). - Kaynaklar arası izolasyonu etkinleştirmek için
Cross-Origin-Opener-Policy: same-origin
veCross-Origin-Embedder-Policy: require-corp
ayarlarını yapın.
- Yalıtılmış bir alt alan adında kullanıcı içeriği sunma (ör. Google,
2. Yaklaşım: Etkin kullanıcı içeriği sunma
Klasik korumalı alan alan adı yaklaşımının zayıf yönlerine bakılmaksızın, etkin içeriğin (örneğin, HTML veya SVG resimleri) güvenli bir şekilde sunulması da mümkündür.
.
En basit seçenek, tarayıcıya yanıtı izole etmesini bildirmek için Content-Security-Policy: sandbox
başlığından yararlanmaktır. Şu anda tüm web tarayıcıları korumalı alan dokümanları için işlem yalıtımı uygulamasa da, tarayıcı işlem modellerinde sürekli yapılan geliştirmeler, korumalı alana alınan içeriğin yerleştirme uygulamalardan ayrılmasını daha iyi hale getirecektir. SpectreJS ve oluşturucu güvenlik ihlali saldırıları, tehdit modelinizin dışındaysa CSP korumalı alanının kullanılması muhtemelen yeterli bir çözümdür.
.
Google olarak, korumalı alan alan adları kavramını modernleştirerek güvenilir olmayan etkin içeriği tamamen izole edebilen bir çözüm geliştirdik. Temel düşüncemiz şudur:
- Herkese açık son ek listesine eklenen yeni bir korumalı alan alanı oluşturun. Örneğin, PSL'ye
exampleusercontent.com
ekleyerekfoo.exampleusercontent.com
vebar.exampleusercontent.com
öğelerinin siteler arası olduğundan ve böylece birbirinden tamamen izole edildiğinden emin olabilirsiniz. *.exampleusercontent.com/shim
ile eşleşen URL'lerin tümü statik bir dolgu dosyasına yönlendirilir. Bu dolgu dosyası,message
etkinlik işleyicisini dinleyen ve aldığı içeriği oluşturan kısa bir HTML ve JavaScript snippet'i içerir.- Ürün bunu kullanmak için
$RANDOM_VALUE.exampleusercontent.com/shim
öğesine bir iframe ya da pop-up oluşturur ve güvenilmeyen içeriği oluşturmak üzere dolguya göndermek içinpostMessage
yöntemini kullanır. - Oluşturulan içerik Blob'a dönüştürülür ve korumalı alana alınmış iframe içinde oluşturulur.
Klasik korumalı alan alan adı yaklaşımına kıyasla bu, tüm içeriğin benzersiz bir sitede tamamen izole edilmesini sağlar. Ayrıca ana uygulamanın işlenecek verilerin alınmasıyla özellik URL'lerinin kullanılmasına gerek kalmaz.
Sonuç
Bu iki çözüm birlikte googleusercontent.com
gibi klasik korumalı alan alanlarından, üçüncü taraf çerezlerini engellemeyle uyumlu daha güvenli çözümlere geçmeyi mümkün kılar. Google'da, bu çözümleri kullanmak için birçok ürünü halihazırda taşıdık ve önümüzdeki yıl için daha fazla taşıma işlemi planlıyoruz.