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 yüksek hassasiyetle kullanmak için kaynaklar arası erişime neden gerekli olduğunu öğrenin.

Giriş

COOP ve COEP kullanarak web sitenizi "kökenler arası izole" yapma bölümünde COOP ve COEP kullanarak "kökler arası erişime kapalı" durumuna nasıl geçeceğinizi açıklamıştık. Bu, tarayıcıda güçlü özellikleri etkinleştirmek için kökler arası erişime kapalı olmasının neden gerekli olduğunu açıklayan tamamlayıcı bir makaledir.

Arka plan

Web aynı kaynak politikası üzerine kuruludur. Bu güvenlik özelliği, dokümanların ve komut dosyalarının başka bir kaynaktan gelen kaynaklarla etkileşim kurma şeklini kısıtlayan bir özelliktir. Bu ilke, web sitelerinin kökler arası kaynaklara erişim yöntemlerini kısıtlar. Örneğin, https://a.example kuruluşuna ait bir dokümanın https://b.example adresinde barındırılan verilere erişmesi engellenir.

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

  • Kaynaklar arası iframe'leri yerleştirme
  • Resimler veya komut dosyaları gibi kaynaklar arası kaynakları ekleyin
  • DOM referansıyla kaynaklar arası pop-up pencereleri aç

Web sıfırdan tasarlansaydı bu istisnalar olmazdı. Ne yazık ki web topluluğu, katı bir aynı kaynak politikasının temel faydalarını fark ettiğinde web zaten bu istisnalara dayanıyordu.

Bu tür geçersiz aynı kaynak politikasının güvenlik yan etkileri iki şekilde yamalanmıştır. Bu yollardan biri, Ortamlar Arası Kaynak Paylaşımı (CORS) adı verilen yeni bir protokolün kullanıma sunulmasıydı. Bu protokolün amacı, sunucunun belirli bir kaynağa sahip kaynak paylaşımına izin vermesini sağlamaktır. Diğer yöntem ise geriye dönük uyumluluğu korurken kaynaklar arası kaynaklara doğrudan komut dosyası erişimini dolaylı yoldan kaldırmaktır. Kaynaklar arası bu tür kaynaklara "opak" kaynaklar denir. Örneğin, çapraz kaynak resmin piksellerini CanvasRenderingContext2D aracılığıyla değiştirmenin, resme CORS uygulanmadığı sürece başarısız olmasının nedeni budur.

Tüm bu politika kararları, bir göz atma bağlam grubunda verilir.

Göz Atma Bağlam Grubu

Uzun bir süre, CORS ve opak kaynakların kombinasyonu tarayıcıları güvenli hale getirmek için yeterliydi. Bazen uç durumlar (JSON güvenlik açıkları gibi) keşfedildi ve yama uygulanması gerekiyordu, ancak genel olarak, kaynaklar arası kaynakların ham baytlarına doğrudan okuma erişimine izin vermeme ilkesi başarılı oldu.

Bunların tümü, kodunuzla aynı tarama içerik grubuna yüklenen tüm verilerin muhtemelen okunabilmesini sağlayan Spectre ile değişti. Saldırganlar, belirli işlemlerin süresini ölçerek CPU önbelleklerinin içeriğini ve bu aracılığıyla işlem belleğinin içeriğini tahmin edebilir. Bu tür zamanlama saldırıları, platformda bulunan düşük ayrıntılı zamanlayıcılarla mümkündür ancak hem açık (performance.now() gibi) hem de örtülü (SharedArrayBuffer gibi) 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 bir Spectre saldırısı kullanabilir. Bu da, "opaklığa" dayalı korumaları etkisiz hale getirir.

Spektr

İdeal olarak, tüm kaynaklar arası isteklerin, kaynağın sahibi olan sunucu tarafından açık bir şekilde incelenmesi gerekir. Kaynağın sahibi olan sunucu inceleme yapmazsa veriler hiçbir zaman kötü niyetli bir kişinin tarama bağlamı grubuna dahil edilmez ve bu nedenle bir web sayfasının yapabileceği Spectre saldırılarının erişim kapsamı dışında kalır. Kökler arası erişime kapalı durum diyoruz. COOP+COEP'in konusu da tam olarak budur.

Kaynaklar arası erişime kapalı bir durumda, istekte bulunan sitenin daha az tehlikeli olduğu kabul edilir. Böylece SharedArrayBuffer, performance.measureUserAgentSpecificMemory() ve yüksek çözünürlüklü zamanlayıcılar gibi güçlü özelliklerin daha yüksek hassasiyetle kilidini açar ve bu özellikler, aksi durumda Spectre benzeri saldırılar için kullanılabilecektir. Ayrıca document.domain öğesinin değiştirilmesini de engeller.

Çapraz Kaynak Yerleştirme Politikası

Kaynaklar Arası Yerleştirme Politikası (COEP), bir dokümanın açıkça izin vermeyen (CORP veya CORS kullanarak) çapraz kaynak kaynakları yüklemesini engeller. Bu özellik sayesinde bir belgenin bu tür kaynakları yükleyemeyeceğini belirtebilirsiniz.

COEP'in işleyiş şekli

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

Cross-Origin-Embedder-Policy: require-corp

require-corp anahtar kelimesi, COEP için kabul edilen tek değerdir. Bu, belgenin yalnızca aynı kaynaktan kaynakları veya başka bir kaynaktan yüklenebilir olarak açıkça işaretlenmiş kaynakları yükleyebileceğini belirten politikayı uygular.

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

Merkezler Arası Kaynak Paylaşımı

Kaynaklar arası kaynak Ortamlar Arası Kaynak Paylaşımı'nı (CORS) destekliyorsa, kaynağı 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 görüntü kaynağı CORS başlıklarıyla sunuluyorsa kaynağı getirme isteğinin CORS modunu kullanması için crossorigin özelliğini kullanın. Bu durum, CORS üst bilgilerini ayarlamadığı sürece resmin yüklenmesini de engeller.

Benzer şekilde, kaynaklar arası verileri fetch() yöntemiyle getirebilirsiniz. Bu yöntem, sunucu doğru HTTP üst bilgileriyle yanıt verdiği sürece özel bir işlem gerektirmez.

Kaynaklar 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 bir etkinleştirme seçeneği olarak kullanıma sunulmuştur. COEP bağlamında CORP, kaynak sahibinin bir kaynağı kimlerin yükleyebileceğine ilişkin 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 olarak işaretlenen kaynaklar herhangi bir web sitesi tarafından yüklenebilir. (Bu değer, COEP ile birlikte CORP spesifikasyonuna eklenmiştir.)

Çapraz Kaynak Açıcı Politikası

Çapraz Kaynak Açıcı Politikası (COOP), üst düzey bir pencerenin diğer belgelere farklı bir göz atma bağlam grubuna yerleştirilerek diğer dokümanlardan izole edilmesini sağlamanıza olanak tanır. Böylece, pencereler doğrudan üst düzey pencereyle etkileşimde bulunamaz. Örneğin, COOP içeren bir doküman pop-up açarsa window.opener özelliği null olur. Ayrıca, Opener'ı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 olarak işaretlenen dokümanlar, açık bir şekilde same-origin olarak işaretlenmiş aynı kaynak dokümanlarla aynı tarama bağlam grubunu paylaşabilir.

COOP

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

same-origin-allow-popups değerine sahip üst düzey bir doküman, COOP özelliğini ayarlamamış veya unsafe-none tutarında bir COOP ayarlayarak yalıtımı devre dışı bırakan tüm pop-up'larına referanslar saklar.

COOP

Cross-Origin-Opener-Policy: unsafe-none

unsafe-none varsayılan değerdir ve açan kişinin COOP'si same-origin olmadığı sürece dokümanın, açıcının tarama bağlam grubuna eklenmesine izin verir.

Ö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 istiyorsanız dokümanınızın hem require-corp değerine sahip COEP'yi hem same-origin değerine sahip COOP'yi kullanması gerektiğini unutmayın. İkisi de yoksa tarayıcı bu güçlü özellikleri güvenli bir şekilde etkinleştirmek için yeterli yalıtım olmasını garanti etmez. self.crossOriginIsolated işlevinin true döndürüp döndürmediğini kontrol ederek sayfanızın durumunu belirleyebilirsiniz.

Bu sorunu uygulamak için izlenecek adımları COOP ve COEP kullanarak web sitenizi "çapraz kaynak izole etme" sayfasından öğrenebilirsiniz.

Kaynaklar