SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
ve daha iyi hassasiyete sahip yüksek çözünürlüklü zamanlayıcı gibi güçlü özellikleri kullanmak için neden kökler arası erişime kapalı web sitelerinin gerektiğini öğrenin.
Giriş
COOP ve COEP kullanarak web sitenizi "kaynaklar arası yalıtılmış" hale getirme başlıklı makalede, COOP ve COEP kullanarak "kaynaklar arası yalıtılmış" durumu nasıl benimseyeceğinizi açıklamıştık. Bu makalede, tarayıcıda güçlü özelliklerin etkinleştirilmesi için neden kökler arası erişimin kapatılması gerektiği açıklanmaktadır.
Arka plan
Web, aynı kaynak politikası üzerine kuruludur. Bu politika, dokümanların ve komut dosyalarının başka bir kaynaktaki kaynaklarla nasıl etkileşime girebileceğini kısıtlayan bir güvenlik özelliğidir. Bu ilke, web sitelerinin kaynaklar arası erişimini kısıtlar. Örneğin, https://a.example
alanındaki bir dokümanın https://b.example
alanında barındırılan verilere erişmesi engellenir.
Ancak aynı kaynak politikasının geçmişte bazı istisnaları olmuştur. Herhangi bir web sitesi şunları yapabilir:
- Kaynaklar arası iframe'leri yerleştirme
- Resimler veya komut dosyaları gibi kaynaklar arası kaynaklar içerme
- DOM referansıyla kaynaklar arası pop-up pencereleri açma
Web sıfırdan tasarlanabilseydi bu istisnalar olmazdı. Maalesef web topluluğu, katı bir aynı kaynak politikasının temel avantajlarını fark ettiğinde web bu istisnalara zaten güveniyordu.
Bu kadar gevşek bir aynı kaynak politikasının güvenlik açısından yan etkileri iki şekilde düzeltildi. Bunun bir yolu, Merkezler Arası Kaynak Paylaşımı (CORS) adlı yeni bir protokolün kullanıma sunulmasıydı. Bu protokolün amacı, sunucunun belirli bir kaynakla kaynak paylaşımına izin vermesini sağlamaktı. Diğer yöntem ise geriye dönük uyumluluğu korurken merkezler arası kaynaklara doğrudan komut dosyası erişimini örtülü olarak kaldırmaktır. Bu tür kaynaklar "opak" kaynaklar olarak adlandırılır. Örneğin, bu nedenle CanvasRenderingContext2D
aracılığıyla merkezler arası bir resmin piksellerini değiştirme işlemi, resme CORS uygulanmadığı sürece başarısız olur.
Tüm bu politika kararları, bir tarama bağlamı grubu içinde gerçekleşir.
Uzun süre boyunca, CORS ve opak kaynakların kombinasyonu tarayıcıları güvenli hale getirmek için yeterliydi. Bazen JSON güvenlik açıkları gibi uç durumlar keşfedildi ve düzeltilmesi gerekti. Ancak genel olarak, kaynaklar arası kaynakların ham baytlarına doğrudan okuma erişimine izin vermeme ilkesi başarılı oldu.
Bu durum, kodunuzla aynı göz atma bağlamı grubuna yüklenen tüm verileri potansiyel olarak okunabilir hale getiren Spectre ile değişti. Saldırganlar, belirli işlemlerin ne kadar sürdüğünü ölçerek CPU önbelleklerinin içeriğini ve dolayısıyla işlemin belleğinin içeriğini tahmin edebilir. Bu tür zamanlama saldırıları, platformda bulunan düşük ayrıntı düzeyine sahip zamanlayıcılarla mümkündür ancak hem açık (ör. performance.now()
) hem de örtülü (ör. SharedArrayBuffer
) yüksek ayrıntı düzeyine sahip zamanlayıcılarla hızlandırılabilir. evil.com
, kaynaklar arası bir resim yerleştirirse piksel verilerini okumak için Spectre saldırısı kullanabilir. Bu durum, "opaklık" özelliğine dayalı korumaları etkisiz hale getirir.
İdeal olarak, tüm kaynaklar arası istekler, kaynağın sahibi olan sunucu tarafından açıkça incelenmelidir. Kaynak sahibi sunucu tarafından doğrulama sağlanmazsa veriler hiçbir zaman kötü niyetli bir kullanıcının göz atma bağlamı grubuna girmez ve bu nedenle bir web sayfasının gerçekleştirebileceği Spectre saldırılarının erişemeyeceği bir yerde kalır. Buna kökler arası erişime kapalı durum denir. COOP+COEP tam olarak bu amaçla kullanılır.
Kaynaklar arası yalıtılmış durumda, istekte bulunan site daha az tehlikeli kabul edilir. Bu durum, aksi takdirde Spectre benzeri saldırılar için kullanılabilecek daha iyi hassasiyete sahip SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
ve yüksek çözünürlüklü zamanlayıcılar gibi güçlü özelliklerin kilidini açar. Ayrıca, değiştirilmesini de önler
document.domain
.
Çapraz Kaynak Yerleştirme Politikası
Cross Origin Embedder Policy (COEP), bir belgenin, belgeye açıkça izin vermeyen (CORP veya CORS kullanarak) merkezler arası kaynakları yüklemesini engeller. Bu özellik sayesinde, bir dokümanın bu tür kaynakları yükleyemeyeceğini belirtebilirsiniz.
Bu politikayı etkinleştirmek için dokümana aşağıdaki HTTP üstbilgisini ekleyin:
Cross-Origin-Embedder-Policy: require-corp
COEP, require-corp
değerini alır. Bu, belgenin yalnızca aynı kaynaktan gelen kaynakları veya başka bir kaynaktan yüklenmek üzere açıkça işaretlenmiş kaynakları yükleyebileceği politikasını zorunlu kılar.
Kaynakların başka bir merkezden yüklenebilmesi için merkezler arası kaynak paylaşımı (CORS) veya merkezler arası kaynak politikası (CORP) desteklemesi gerekir.
Merkezler Arası Kaynak Paylaşımı
Merkezler arası bir kaynak Merkezler Arası Kaynak Paylaşımı
(CORS)'nı destekliyorsa COEP tarafından engellenmeden web sayfanıza yüklemek için crossorigin
özelliğini
kullanabilirsiniz.
<img src="https://third-party.example.com/image.jpg" crossorigin>
Örneğin, bu resim kaynağı CORS başlıklarıyla yayınlanıyorsa kaynağı getirme isteğinin CORS modunu kullanması için crossorigin
özelliğini kullanın. Bu durum, CORS başlıkları ayarlanmadığı sürece resmin yüklenmesini de engeller.
Benzer şekilde, sunucu doğru HTTP üstbilgileri ile yanıt verdiği sürece özel işlem gerektirmeyen fetch()
yöntemiyle de kaynaklar arası veri getirebilirsiniz.
Çapraz Kaynak Kaynak Politikası
Merkezler Arası Kaynak Politikası (CORP), kaynaklarınızın başka bir kaynak tarafından yüklenmesini engellemek için başlangıçta isteğe bağlı olarak kullanıma sunulmuştu. COEP bağlamında CORP, bir kaynağı kimin yükleyebileceğine ilişkin kaynak sahibinin politikasını belirtebilir.
Cross-Origin-Resource-Policy
başlığı üç olası değer alır:
Cross-Origin-Resource-Policy: same-site
same-site
ile işaretlenen kaynaklar yalnızca aynı siteden yüklenebilir.
Cross-Origin-Resource-Policy: same-origin
same-origin
ile işaretlenen kaynaklar yalnızca aynı kaynaktan yüklenebilir.
Cross-Origin-Resource-Policy: cross-origin
cross-origin
ile işaretlenen kaynaklar herhangi bir web sitesi tarafından yüklenebilir. (Bu değer, COEP ile birlikte CORP spesifikasyonuna eklendi.)
Çapraz Kaynak Açıcı Politikası
Cross Origin Opener Policy
(COOP), üst düzey pencerenin diğer belgelerden izole edilmesini sağlar. Bu amaçla, belgeler farklı bir tarama bağlamı grubuna yerleştirilir. Böylece, belgeler üst düzey pencereyle doğrudan etkileşimde bulunamaz. Örneğin, COOP içeren bir doküman pop-up açarsa window.opener
özelliği null
olur. Ayrıca, açanın referansının .closed
özelliği true
değerini döndürür.
Cross-Origin-Opener-Policy
başlığı üç olası değer alır:
Cross-Origin-Opener-Policy: same-origin
same-origin
ile işaretlenen dokümanlar, aynı kaynağa sahip ve açıkça same-origin
ile işaretlenmiş dokümanlarla aynı göz atma bağlamı grubunu paylaşabilir.
Cross-Origin-Opener-Policy: same-origin-allow-popups
same-origin-allow-popups
içeren üst düzey bir doküman, COOP'u ayarlamayan veya unsafe-none
COOP'u ayarlayarak izolasyonu devre dışı bırakan pop-up'larına yönelik referansları korur.
Cross-Origin-Opener-Policy: unsafe-none
unsafe-none
varsayılandır ve açıcıda same-origin
COOP'u yoksa dokümanın açıcısının göz atma bağlamı grubuna eklenmesine izin verir.
Özet
SharedArrayBuffer
,
performance.measureUserAgentSpecificMemory()
veya daha iyi hassasiyete sahip yüksek çözünürlüklü
zamanlayıcılar gibi güçlü özelliklere erişimi garanti etmek istiyorsanız dokümanınızın hem require-corp
değerine sahip COEP'yi hem de same-origin
değerine sahip COOP'yi kullanması gerektiğini unutmayın. Bu iki özellikten biri olmadığında tarayıcı, bu güçlü özelliklerin güvenli bir şekilde etkinleştirilmesi için yeterli izolasyonu garanti etmez. self.crossOriginIsolated
true
döndürüp döndürmediğini kontrol ederek sayfanızın durumunu belirleyebilirsiniz.
Bu özelliği uygulama adımlarını COOP ve COEP kullanarak web sitenizi "kaynaklar arası yalıtılmış" hale getirme başlıklı makalede bulabilirsiniz.