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

SharedArrayBuffer, performance.measureUserAgentSpecificMemory() ve yüksek çözünürlüklü zamanlayıcı gibi güçlü özellikleri daha hassas bir şekilde kullanmak için neden kökler arası erişimin kapatılması gerektiğini öğrenin.

Giriş

COOP ve COEP'yi kullanarak web sitenizi "kaynak ayırımlı" hale getirme başlıklı makalede, COOP ve COEP'yi kullanarak "kaynak ayırımlı" duruma nasıl geçeceğinizi açıklamıştık. Bu makale, tarayıcıda güçlü özellikleri etkinleştirmek için kökler arası erişimin neden gerekli olduğunu açıklayan tamamlayıcı bir makaledir.

Arka plan

Web, aynı kaynak politikası üzerine kuruludur. Bu politika, dokümanların ve komut dosyalarının başka bir kaynaktaki kaynaklarla etkileşimini kısıtlayan bir güvenlik özelliğidir. Bu ilke, web sitelerinin kaynak dışı kaynaklara erişme yollarını kısıtlar. Örneğin, https://a.example'teki bir dokümanın https://b.example'te barındırılan verilere erişmesi engellenir.

Ancak aynı kaynak politikasının geçmişte bazı istisnaları vardı. Tüm web siteleri:

  • Kaynaklar arası iframe'ler yerleştirme
  • Resim veya komut dosyası gibi kaynakta çapraz kaynaklar ekleme
  • DOM referansı ile kaynakta çapraz pop-up pencereleri açma

Web sıfırdan tasarlanabilseydi bu istisnalar olmazdı. Maalesef web topluluğu, katı bir aynı kaynak politikasının önemli avantajlarını fark ettiğinde web bu istisnalara zaten güveniyordu.

Bu tür gevşek bir aynı kaynak politikasının güvenlikle ilgili yan etkileri iki şekilde düzeltildi. Bunun bir yolu, Merkezler Arası Kaynak Paylaşımı (CORS) adlı yeni bir protokolün kullanıma sunulmasıdır. Bu protokolün amacı, sunucunun belirli bir kaynakla bir kaynağın paylaşılmasına izin vermesini sağlamaktır. Diğer yöntem ise geriye dönük uyumluluğu korurken komut dosyasının merkezler arası kaynaklara doğrudan erişimini dolaylı olarak kaldırmaktır. Bu tür kaynak dışı kaynaklara "opak" kaynaklar denir. Örneğin, bir kaynakta olmayan resmin piksellerini CanvasRenderingContext2D aracılığıyla değiştirmek, resme CORS uygulanmadığı sürece başarısız olur.

Tüm bu politika kararları, tarama bağlamı grubunda gerçekleşir.

Tarama Bağlam Grubu

Uzun süredir CORS ve opak kaynakların bir arada kullanılması, tarayıcıların güvenli olması için yeterliydi. Bazen uç durumlar (ör. JSON güvenlik açıkları) keşfedildi ve bunların düzeltilmesi gerekiyordu ancak genel olarak kaynak farklı olan kaynakların ham baytlarına doğrudan okuma erişimine izin vermeme ilkesi başarılı oldu.

Tüm bunlar Spectre ile değişti. Bu araç, kodunuzla aynı tarama bağlamı grubuna yüklenen tüm verileri okunabilir hale getirir. Saldırganlar, belirli işlemlerin ne kadar sürdüğünü ölçerek CPU önbelleklerinin içeriğini ve bu sayede de 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 (performance.now() gibi) hem de gizli (SharedArrayBuffer gibi) yüksek ayrıntı düzeyine sahip zamanlayıcılarla hızlandırılabilir. evil.com, kaynakta farklı bir resim yerleştirirse pikselli verilerini okumak için Spectre saldırısı kullanabilir. Bu da "saydamlığa" dayalı korumaların etkisiz hale gelmesine neden olur.

Spectr

İdeal olarak, kaynakta çapraz isteklerin tümü, kaynağın sahibi olan sunucu tarafından açıkça incelenmelidir. Kaynak sahibi sunucu tarafından inceleme yapılmazsa veriler hiçbir zaman kötü niyetli bir kullanıcının tarama bağlamı grubuna giremez 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 da bu amaçla oluşturulmuştur.

Kaynaklar arası izole durumda, istek gönderen site daha az tehlikeli olarak kabul edilir. Bu sayede, Spectre benzeri saldırılar için kullanılabilecek SharedArrayBuffer, performance.measureUserAgentSpecificMemory() ve yüksek çözünürlüklü zamanlayıcılar gibi güçlü özelliklerin daha iyi bir hassasiyetle kullanılmasına olanak tanınmış olur. Ayrıca document.domain'nin değiştirilmesini de engeller.

Çapraz Kaynak Yerleştirme Politikası

Çok Kaynaklı Yerleştiren Politikası (COEP), bir dokümanın, doküman iznini açıkça vermeyen (CORP veya CORS kullanılarak) merkezler arası kaynakları yüklemesini engeller. Bu özellik sayesinde, bir dokümanın bu tür kaynakları yükleyemediğini belirtebilirsiniz.

COEP'nin işleyiş şekli

Bu politikayı etkinleştirmek için dokümana aşağıdaki HTTP üst bilgisini ekleyin:

Cross-Origin-Embedder-Policy: require-corp

COEP, tek bir require-corp değeri alır. Bu, belgenin yalnızca aynı kaynaktan veya başka bir kaynaktan yüklenebilir olarak açıkça işaretlenmiş kaynaklardan kaynak yükleyebileceği politikasını zorunlu kılar.

Kaynakların başka bir kaynaktan yüklenebilir olması için Merkezler Arası Kaynak Paylaşımı (CORS) veya Merkezler Arası Kaynak Politikası'nı (CORP) desteklemesi gerekir.

Merkezler Arası Kaynak Paylaşımı

Bir merkezler arası 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, CORS başlıkları ayarlanmazsa resmin yüklenmesini de engeller.

Benzer şekilde, fetch() yöntemi aracılığıyla kaynakta farklı olan verileri getirebilirsiniz. Bu yöntem, sunucu doğru HTTP başlıkları ile yanıt verdiği sürece özel işlem gerektirmez.

Merkezler Arası Kaynak Politikası

Kaynaklar Arası Kaynak Politikası (CORP), başlangıçta kaynaklarınızın başka bir kaynak tarafından yüklenmesini önlemek için etkinleştirilmesi gereken bir özellik olarak kullanıma sunulmuştur. COEP bağlamında CORP, kaynak sahibinin bir kaynağı kimlerin yükleyebileceğine dair politikasını belirtebilir.

Cross-Origin-Resource-Policy başlığı üç olası değer alır:

Cross-Origin-Resource-Policy: same-site

same-site işaretli kaynaklar yalnızca aynı siteden yüklenebilir.

Cross-Origin-Resource-Policy: same-origin

same-origin işaretli kaynaklar yalnızca aynı kaynaktan yüklenebilir.

Cross-Origin-Resource-Policy: cross-origin

cross-origin işaretli kaynaklar herhangi bir web sitesi tarafından yüklenebilir. (Bu değer, COEP ile birlikte CORP spesifikasyonuna eklenmiştir.)

Çapraz Kaynak Açıcı Politikası

Merkezler Arası Açıcı Politikası (COOP), bir üst düzey pencerenin diğer dokümanlardan farklı bir tarama bağlamı grubuna yerleştirilerek diğer dokümanlarla doğrudan etkileşime geçemeyecek şekilde izole edilmesini sağlar. Örneğin, COOP içeren bir belge pop-up açarsa window.opener mülkü null olur. Ayrıca, açıcı öğesinin kendisine referansı olan .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 işaretli dokümanlar, aynı kaynaktan gelen ve açıkça same-origin işaretli dokümanlarla aynı tarama bağlamı grubunu paylaşabilir.

COOP

Cross-Origin-Opener-Policy: same-origin-allow-popups

same-origin-allow-popups içeren üst düzey bir belge, COOP ayarlamayan veya unsafe-none değerinde bir COOP ayarlayarak izolasyonu devre dışı bırakan pop-up'larına ilişkin referansları korur.

COOP

Cross-Origin-Opener-Policy: unsafe-none

Varsayılan değer unsafe-none'tür ve açan kullanıcının COOP değeri same-origin olmadığı sürece dokümanın, açan kullanıcının tarama bağlam grubuna eklenmesine olanak tanır.

Özet

SharedArrayBuffer, performance.measureUserAgentSpecificMemory() veya yüksek çözünürlüklü zamanlayıcılar gibi güçlü özelliklere daha yüksek hassasiyetle garantili erişim elde etmek istiyorsanız dokümanınızda hem require-corp değerine sahip COEP hem de same-origin değerine sahip COOP'un kullanılması gerektiğini unutmayın. Bu iki koşuldan biri sağlanmazsa tarayıcı, bu güçlü özellikleri güvenli bir şekilde etkinleştirmek için yeterli izolasyonu garanti etmez. self.crossOriginIsolated işlevinin true değerini döndürüp döndürmediğini kontrol ederek sayfanızı durumunu belirleyebilirsiniz.

Bunu uygulamayla ilgili adımları COOP ve COEP'yi kullanarak web sitenizi "kaynaklar arası izole" hale getirme başlıklı makalede bulabilirsiniz.

Kaynaklar