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

Yayınlanma tarihi: 4 Mayıs 2020

COOP ve COEP kullanarak web sitenizi "kökler arası erişime kapalı" yapma başlıklı makalede, COOP ve COEP kullanarak "kökler arası erişime kapalı" durumunu nasıl benimseyeceğinizi açıklamıştık. Bu makalede, tarayıcıda güçlü özellikleri etkinleştirmek için neden kökler arası erişime kapalı web sitelerinin gerekli olduğu açıklanmaktadır.

Sözlük

Bu belgede, benzer şekilde adlandırılmış ve kısaltılmış birçok terim kullanılmaktadır. Daha net bir şekilde açıklamak için mini bir sözlük hazırladık:

Arka plan

Web, 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ği olan aynı kaynak politikası üzerine kuruludur. Bu ilke, web sitelerinin kaynaklar arası kaynaklara erişebileceği yöntemleri kısıtlar. Örneğin, https://a.example alanından gelen 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:

  • Çapraz kaynak iframe'leri yerleştirme
  • Resimler veya komut dosyaları gibi kaynaklar arası kaynakları dahil etme
  • DOM referansıyla çapraz kaynak iletişim kutusu pencereleri açma

Web topluluğu katı bir aynı kaynak politikasının faydalarını fark ettiğinde web, bu istisnalara zaten bağımlıydı.

Bu kadar gevşek bir aynı kaynak politikasının güvenlik açısından yan etkileri iki şekilde düzeltildi:

  • Merkezler Arası Kaynak Paylaşımı (CORS) protokolü, sunucunun belirli bir kaynakla kaynak paylaşımına izin vermesini sağlar.
  • Geliştiriciler, geriye dönük uyumluluğu korurken çapraz kaynak kaynaklara doğrudan komut dosyası erişimini örtülü olarak kaldırır. Bu tür çapraz kaynaklı kaynaklara "opak" kaynaklar denir. Bu nedenle, resme CORS uygulanmadığı sürece CanvasRenderingContext2D ile çapraz kaynak piksel manipülasyonu başarısız olur.

Bu politika kararlarının tümü bir göz atma bağlamı grubu içinde gerçekleşir.

Göz atma bağlamı grubu, birincil siteyi ve yerleştirilmiş sitedeki öğeleri içerir.

Uzun süre boyunca bu kombinasyon, tarayıcıları güvende tutmak için yeterliydi. Doğrudan düzeltme gerektiren sınırlı uç durumlar (ör. JSON güvenlik açıkları) vardı.

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 ve dolayısıyla işlemin belleğinin içeriğini tahmin edebilir. Bu tür saldırılar, platformda bulunan düşük ayrıntı düzeyine sahip zamanlayıcılarla mümkündür ve 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, çapraz kaynak bir resim yerleştirirse yerleştirilen resmin piksel verilerini okumak için Spectre saldırısı kullanabilir. Bu durum, "opaklık" özelliğine dayalı korumaları etkisiz hale getirir.

Evil.com, Spectre kullanarak yerleştirilmiş b.example iframe'ine ve resimlerine saldıran ana web sitesidir.

İdeal olarak, tüm çapraz kaynak istekler, kaynağın sahibi olan sunucu tarafından incelenir. Uygunluk değerlendirmesi yapılmadıysa veriler hiçbir zaman kötü niyetli bir aktörün göz atma bağlamı grubuna ulaşmamalıdır. Bu nedenle, veriler olası Spectre saldırılarının erişemeyeceği bir yerde kalır. Buna kökler arası erişime kapalı durum denir.

Yerleştirilmiş kod, kökler arası erişime kapalı durumda olduğunda istekte bulunan site daha az tehlikeli olarak kabul edilir. Bu sayede, istekte bulunan site olası Spectre saldırılarını önlerken daha iyi hassasiyetle SharedArrayBuffer, performance.measureUserAgentSpecificMemory() ve yüksek çözünürlüklü zamanlayıcılar kullanabilir. Bu durum, document.domain öğesinin değiştirilmesini de engeller.

Çapraz Kaynak Yerleştirme Politikası

Cross Origin Embedder Policy (COEP), bir belgenin CORP veya CORS ile açıkça izin vermeyen kaynaklar arası kaynakları yüklemesini engeller. Bu özellik sayesinde, bir dokümanın bu tür kaynakları yükleyemeyeceğini belirtebilirsiniz.

CORP politikaları sayesinde hangi yerleştirilmiş öğelere izin verildiğini ve verilmediğini gösteren bir şema.
Üst site, a.example, COEP politikasını require-corp olarak ayarladı. a.example, b.example kaynağından 3 öğe yerleştirmek istiyor ancak yalnızca ikisi başarılı oluyor. Başarılı olan iki yerleştirme arasında, kaynaklar arası CORP politikası içeren bir JavaScript dosyası ve CORS'a izin verilen bir resim yer alıyor. Üçüncü öğe, yalnızca aynı kaynakta yerleştirilmesi gereken bir CORP politikasına sahip bir videodur. Bu nedenle video, a.example üzerinde yüklenmez.

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

Cross-Origin-Embedder-Policy: require-corp

COEP, tek bir require-corp değeri alır. Bu, belgenin yalnızca aynı kaynaktaki kaynakları veya başka bir kaynaktan yüklenebilir olarak 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ını (CORS) veya merkezler arası kaynak politikasını (CORP) desteklemesi gerekir.

Merkezler Arası Kaynak Paylaşımı

Merkezler arası bir kaynak Merkezler Arası Kaynak Paylaşımı (CORS)'nı destekliyorsa crossorigin özelliğini kullanarak COEP tarafından engellenmeden web sayfanıza yükleyebilirsiniz.

<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ı başka bir kaynak tarafından yüklenmeye karşı korumak 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), belgeleri ayrı bir göz atma bağlamı grubuna yerleştirerek üst düzey bir pencereyi diğer belgelerden izole etmenizi sağlar. Bu şekilde, dokümanlar üst düzey pencereyle doğrudan etkileşim kuramaz. Örneğin, COOP içeren bir doküman bir iletişim kutusu açarsa window.opener özelliği null olur. Açıcı referansının .closed özelliği true.

a.example, b.example'ı iletişim kutusunda açamadı.

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.

Aynı Gözatma Bağlamı Grubu'nda bulunan ancak Gözatma Bağlamı Grubu'nun dışında olduğu sürece &quot;aynı kaynak&quot; olarak etiketlenmemiş bir &quot;aynı kaynak&quot; pop-up'ı ile etkileşim kurabilen pencereyi gösteren çizim.

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 belgenin 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 özelliklere erişmek istiyorsanız dokümanınızda hem require-corp değerine sahip COEP hem de same-origin değerine sahip COOP kullanılmalıdır. Bu iki öğeden biri olmadığında tarayıcı, bu güçlü özelliklerin güvenli bir şekilde etkinleştirilmesi için yeterli izolasyonu garanti etmez. Sayfanızın durumunu, self.crossOriginIsolated true döndürüp döndürmediğini kontrol ederek belirleyebilirsiniz.

Bu özelliği nasıl uygulayacağınızı COOP ve COEP kullanarak web sitenizi "kaynaklar arası yalıtılmış" hale getirme başlıklı makaleden öğrenebilirsiniz.

Kaynaklar