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