Depolama Alanı Bölümlendirme

Chrome, belirli yan kanal siteler arası izleme türlerini önlemek için çoğu depolama ve iletişim API'sini üçüncü taraf bağlamlarında bölümlendirmiştir.

Uygulama durumu

Bu özellik, Chrome 115 ve sonraki sürümleri kullanan tüm kullanıcılar için etkinleştirilmiştir. Depolama alanı bölümlendirme önerisi hakkında daha fazla tartışmaya açıktır.

Depolama alanı bölümlendirmesi nedir?

Chrome, belirli yan kanal siteler arası izleme türlerini önlemek için depolama ve iletişim API'lerini üçüncü taraf bağlamlarında bölümlendirir.

Depolama alanı bölümlendirmesi olmadan bir site, kullanıcıyı web'de izlemek için farklı sitelerdeki verileri birleştirebilir. Ayrıca, yerleşik sitenin zamanlama saldırıları, XS-Leaks ve COSI gibi yan kanal tekniklerini kullanarak üst düzey sitedeki kullanıcıyla ilgili belirli durumları çıkarmasına olanak tanır.

Depolama alanı geçmişte yalnızca kaynağa göre anahtarlanmıştır. Bu, example.com'ten bir iFrame, a.com ve b.com'ye yerleştirilirse depolama alanında bir kimliği depolayıp başarılı bir şekilde alarak bu iki sitedeki tarama alışkanlıklarınız hakkında bilgi edinebileceği anlamına gelir. Üçüncü taraf depolama alanı bölümlendirmesi etkinleştirildiğinde example.com için depolama alanı, biri a.com, diğeri b.com için olmak üzere iki farklı bölümde bulunur.

Bölme işlemi genellikle, yerel depolama ve IndexedDB gibi depolama API'leri tarafından bir iframe aracılığıyla depolanan verilerin artık aynı kaynaktaki tüm bağlamlar tarafından erişilemez hale gelmesi anlamına gelir. Bunun yerine, veriler yalnızca aynı köke ve aynı üst düzey siteye sahip bağlamlar tarafından kullanılabilir.

Önce

Bölme olmadan depolama API'lerinin şeması.
Depolama alanı bölümlenmeden önce example.com, a.com'a yerleştirildiğinde veri yazabilir ve daha sonra b.com'a yerleştirildiğinde bu verileri okuyabilir.

Sonra

Bölme içeren depolama API'lerinin şeması.
Depolama alanı bölümlendirildikten sonra, b.com'a yerleştirilen example.com, a.com'a yerleştirildiğinde example.com'un depolama alanına erişemez.

Zincirlenmiş iframe'lerde depolama alanı bölümlendirme

Bir iframe'ın içinde iframe olduğunda durum daha da karmaşık hale gelir. Bu durum özellikle aynı kaynak zincirde birden fazla yerde olduğunda geçerlidir.

Örneğin, A1, B için bir iframe içerir. Bu iframe, A2 için bir iframe içerir. Hem A1 hem de A2 aynı sitededir. Bölme işleminde yalnızca üst düzey ve mevcut düzey bağlamlarını dikkate alırsak, araya giren üçüncü taraf iFrame'e (B) rağmen üst düzey (A1) ile aynı sitede olduğu için A2 iFrame'i birinci taraf olarak kabul edilebilir. A2 varsayılan olarak bölümlenmemiş depolamaya erişebiliyorsa bu durum A2'yi tıklama tuşuyla yönlendirme gibi güvenlik risklerine açık hale getirebilir.

Chrome bu sorunu gidermek için depolama alanı bölüm anahtarının bir parçası olarak ek bir "ata bit'i" ekler. Bu bit, geçerli bağlam ile üst düzey bağlam arasındaki herhangi bir belge geçerli bağlamla siteler arasıysa ayarlanır. Bu durumda, Site B siteler arası olduğundan bit A2 için ayarlanır ve depolama alanı A1'den ayrılır.

Zincirde siteler arası bağlam olmadığında depolama alanı bölümlenmez. Örneğin, A3 için bir iFrame içeren A2 için bir iFrame içeren Site A1, tümü aynı sitede olduğu için A1, A2 veya A3 için bölümlenmez.

Zincirlenmiş iframe'lerde bölümlenmemiş erişime ihtiyaç duyan siteler için Chrome, bu kullanım alanını etkinleştirmek amacıyla Storage Access API'yi genişletmeyi denemektedir. Depolama Alanı Erişimi API'si, çerçevelenen sitenin API'yi açıkça çağırmasını gerektirdiğinden, bu durum tıklama tuşuyla saldırı riskini azaltır.

Güncellenen API'ler

Bölme işleminden etkilenen API'ler aşağıdaki gruplara ayrılabilir:

Depolama API'leri

  • Kota sistemi
    Kota sistemi, depolama alanı için ne kadar disk alanının ayrılacağını belirlemek amacıyla kullanılır. Kota sistemi, ne kadar alana izin verildiğini ve ne zaman temizleneceğini belirlemek için her bir bölümü ayrı bir paket olarak yönetir.
    navigator.storage.estimate(), bölümle ilgili bilgileri döndürür. window.webkitStorageInfo ve navigator.webkitTemporaryStorage gibi yalnızca Chrome'a özel API'lerin desteği sonlandırılacak.
    IndexedDB ve önbelleğe alma, yeni bölümlenmiş kota sistemini kullanır.
  • Web Storage API
    Web Storage API, tarayıcıların anahtar/değer çiftlerini depolayabileceği mekanizmalar sağlar. İki mekanizma vardır: Yerel Depolama ve Oturum Depolaması. Şu anda kota yönetimi uygulanmasa da bölümlere ayrılmış durumdadır.
  • Origin Özel Dosya Sistemi
    Dosya Sistemi Erişimi API'si, kullanıcı erişim izni verdikten sonra sitenin değişiklikleri doğrudan cihazdaki dosyalara ve klasörlere okumasına veya kaydetmesine olanak tanır. Kaynak Özel Dosya Sistemi, kaynağın diske özel içerik depolamasına olanak tanır. Bu içerikler kullanıcı tarafından kolayca erişilebilir ve bölümlendirilir.
  • Storage Bucket API
    Storage Bucket API, paket adı verilen yeni bir kavram kullanarak IndexedDB ve localStorage gibi çeşitli depolama API'lerini birleştiren Storage Standard için geliştirilmektedir. Paketlerde depolanan veriler ve paketlerle ilişkili meta veriler bölümlenir.
  • Clear-Site-Data başlığı
    Yanıta Clear-Site-Data başlığının eklenmesi, sunucunun kullanıcının tarayıcısında depolanan verilerin temizlenmesini istemesine olanak tanır. Önbelleği, çerezleri ve DOM depolama alanını temizleyebilirsiniz. Başlığı kullanarak yalnızca bir bölümdeki depolama alanı temizlenir.
  • Blob URL mağazası
    Blob, işlenecek ham verileri içeren bir nesnedir. Kaynağa erişmek için bir blob URL'si oluşturulabilir. Blob URL depoları bölümlendirilmez. Üst düzey bir bağlamda herhangi bir blob URL'sine (tartışma) gitmeyle ilgili bir kullanım alanını desteklemek için blob URL'si mağazası, üst düzey site yerine aracı kümesi tarafından bölümlenebilir. Bu özellik henüz test için kullanılamaz ve bölümlendirme mekanizması gelecekte değişebilir.

İletişim API'leri

Depolama API'lerinin yanı sıra, bir bağlamın kaynak sınırları arasında iletişim kurmasına olanak tanıyan iletişim API'leri de bölümlenir. Değişiklikler, esas olarak yayın veya aynı kaynak buluşması aracılığıyla diğer bağlamların keşfedilmesine izin veren API'leri etkiler.

Aşağıdaki iletişim API'leri için üçüncü taraf iFrame'ler artık aynı kaynak bağlamıyla iletişim kuramaz:

  • Yayın Kanalı
    Broadcast Channel API, tarama bağlamları (pencereler, sekmeler veya iFrame'ler) ile aynı kaynaktaki çalışanlar arasında iletişime olanak tanır.
    Bağlamlar arasındaki ilişkinin açıkça tanımlandığı siteler arası iframe postMessage()'lerin değiştirilmesi önerilmez.
  • SharedWorker
    SharedWorker API, aynı köke sahip tarama bağlamlarında erişilebilen bir işleyici sağlar.
  • Web Kilitleri
    Web Locks API, aynı kaynaktaki bir sekmede veya çalışanda çalışan kodun, bazı işlemler yapılırken paylaşılan bir kaynak için kilit almasına olanak tanır.

Service Worker API

Service Worker API, arka planda görev yürütmek için arayüzü sağlar. Sites, olaylara yanıt vermek için yeni çalışan bağlamı oluşturan kalıcı kayıtlar oluşturur ve bu çalışan, aynı kaynaktaki herhangi bir bağlamla iletişim kurabilir. Ayrıca Service Worker API, gezinme isteklerinin zamanlamasını değiştirerek geçmişi koklama gibi siteler arası bilgi sızıntısı olasılığına yol açabilir.

Bu nedenle, üçüncü taraf bağlamından kaydedilen hizmet çalışanları bölümlenir.

Uzatma API'leri

Uzantılar, kullanıcıların göz atma deneyimlerini özelleştirmelerine olanak tanıyan programlardır.

Uzatma sayfaları (chrome-extension:// şemasına sahip sayfalar), web'deki sitelere yerleştirilebilir ve bu durumlarda üst düzey bölüme erişmeye devam ederler. Bu sayfalar diğer siteleri de yerleştirebilir. Bu durumda, uzantı ilgili site için barındırma izinlerine sahip olduğu sürece bu siteler üst düzey bölümlerine erişebilir.

Daha fazla bilgi için uzantı belgelerine göz atın.

Demo: Depolama alanı bölümlendirmesini test etme

Demo site: https://storage-partitioning-demo-site-a.glitch.me/

Her test için solda yeşil onay işaretlerini ve sağda kırmızı çarpıları gösteren demo sitenin ekran görüntüsü.
Sol tarafta depolama alanı bölümlendirmesi olan ve sağ tarafta depolama alanı bölümlendirmesi olmayan bir tarayıcı için çıkışı gösteren demo ekran görüntüsü.

Demoda iki site kullanılmaktadır: A sitesi ve B sitesi.

  • Üst düzey bağlamda A sitesini ziyaret ettiğinizde site, çeşitli depolama yöntemlerini kullanarak verileri ayarlar.
  • B sitesi, A sitesinden bir sayfayı yerleştirir ve bu yerleşik sayfa daha önce ayarlanan depolama seçeneklerini okumaya çalışır.
  • A sitesi B sitesine yerleştirildiğinde, depolama alanı bölümlendiğinde bu verilere erişemez ve bu nedenle okumalar başarısız olur.
  • Demo, verilerin bölümlendirilip bölümlendirilmediğini göstermek için her okumanın başarılı veya başarısız olup olmadığını kullanır.

Şu anda Chrome'da depolama alanı bölümlendirmeyi --disable-features=ThirdPartyStoragePartitioning komut satırı anahtarını kullanarak devre dışı bırakabilirsiniz.

Diğer tarayıcıların bölümlendirme durumlarını görmek için aynı şekilde test edebilirsiniz.

Etkileşim kurma ve geri bildirim paylaşma