Güçlü özellikler için neden "köşeler arası erişime kapalı" olması gerekir?

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.

Göz atma bağlamı grubu

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.

Spectr

İ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.

COEP'nin işleyiş şekli

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.

COOP

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.

COOP

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.

COOP

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.

Kaynaklar