Partizionamento dello spazio di archiviazione

Per evitare determinati tipi di monitoraggio tra siti side-channel, Chrome ha partizionato la maggior parte delle API di archiviazione e comunicazione in contesti di terze parti.

Stato implementazione

La funzionalità è stata attivata per tutti gli utenti su Chrome 115 e versioni successive. La proposta di partizionamento dello spazio di archiviazione è aperta per ulteriori discussioni.

I siti che non hanno avuto il tempo di implementare il supporto per il partizionamento dello spazio di archiviazione di terze parti possono partecipare a una prova di ritiro per annullare la partizione temporaneamente (continuare l'isolamento in base al criterio della stessa origine, ma rimuovere l'isolamento per sito di primo livello) e ripristinare il comportamento precedente di API di archiviazione, service worker e API di comunicazione nei contenuti incorporati sul loro sito.

Che cos'è il partizionamento dello spazio di archiviazione?

Per evitare determinati tipi di monitoraggio tra siti side-channel, Chrome sta partizionando le API di archiviazione e comunicazione in contesti di terze parti.

Senza il partizionamento dello spazio di archiviazione, un sito può unire i dati di diversi siti per monitorare l'utente sul web. Inoltre, consente al sito incorporato di dedurre stati specifici dell'utente nel sito di primo livello utilizzando tecniche side-channel come Timing Attacks, XS-Leaks e COSI.

In passato, lo spazio di archiviazione era basato solo sull'origine. Ciò significa che se un iframe da example.com è incorporato su a.com e b.com, potrebbe conoscere le tue abitudini di navigazione per questi due siti archiviando e recuperando correttamente un ID dallo spazio di archiviazione. Se il partizionamento dello spazio di archiviazione di terze parti è abilitato, lo spazio di archiviazione per example.com è disponibile in due partizioni diverse, una per a.com e l'altra per b.com.

Il partizionamento in genere significa che i dati archiviati da API di archiviazione come l'archiviazione locale e IndexedDB da un iframe non sono più accessibili a tutti i contesti nella stessa origine. Al contrario, i dati sono disponibili solo per contesti con la stessa origine e lo stesso sito di primo livello.

Prima

Diagramma delle API di archiviazione senza partizionamento.
Prima del partizionamento dello spazio di archiviazione, example.com può scrivere dati quando è incorporato in a.com e poi leggerli quando è incorporato in b.com.

Dopo

Diagramma delle API di archiviazione con partizionamento.
Dopo il partizionamento dello spazio di archiviazione, example.com, se incorporato in b.com, non potrà accedere allo spazio di archiviazione di example.com se incorporato in a.com.

Partizionamento dello spazio di archiviazione su iframe concatenati

Quando un iframe contiene un iframe, questo inizia a essere più complicato. Questo è particolarmente vero quando la stessa origine si trova in più punti della catena.

Ad esempio, A1 contiene un iframe per B che contiene un iframe per A2 e che A1 e A2 si trovano sullo stesso sito. Se consideriamo solo i contesti di primo livello e di livello corrente al momento del partizionamento, l'iframe A2 potrebbe essere considerato proprietario in quanto si trova sullo stesso sito del primo livello (A1) nonostante l'iframe di terze parti (B). Questo potrebbe esporre A2 a rischi di sicurezza come il clickjacking se A2 avesse accesso a uno spazio di archiviazione non partizionato per impostazione predefinita.

Per risolvere questo problema, Chrome include un "bit predecessore" aggiuntivo come parte della chiave di partizione dello spazio di archiviazione, che viene impostato se qualsiasi documento tra il contesto corrente e quello di primo livello è cross-site rispetto al contesto attuale. In questo caso, il sito B è tra siti, quindi il bit viene impostato per A2 e il relativo spazio di archiviazione viene partizionato da A1.

Se nella catena non è presente alcun contesto tra siti, l'archiviazione non è partizionata. Ad esempio, il sito A1 contenente un iframe per A2 contenente un iframe per A3 non verrebbe partizionato per A1, A2 o A3 poiché tutti si trovano sullo stesso sito.

Per i siti che richiedono l'accesso non partizionato negli iframe concatenati, Chrome sta sperimentando l'estensione dell'API Storage Access per abilitare questo caso d'uso. Poiché l'API Storage Access richiede che il sito con frame richiami esplicitamente l'API, questo riduce il rischio di clickjacking.

API aggiornate

Le API interessate dal partizionamento possono essere suddivise nei seguenti raggruppamenti:

API Storage

  • Sistema di quote
    Il sistema di quote viene utilizzato per determinare la quantità di spazio su disco allocata per l'archiviazione. Il sistema di quote gestisce ogni partizione come un bucket separato per determinare la quantità di spazio consentita e quando viene liberato.
    L'elemento navigator.storage.estimate() restituisce le informazioni della partizione. Le API solo di Chrome, come window.webkitStorageInfo e navigator.webkitTemporaryStorage, verranno deprecate.
    IndexedDB e lo spazio di archiviazione nella cache utilizzano il nuovo sistema di quote partizionate.
  • API Web Storage
    L'API Web Storage fornisce meccanismi tramite i quali i browser possono archiviare coppie chiave/valore. Esistono due meccanismi: archiviazione locale e Archiviazione della sessione. Attualmente non sono gestiti per la quota, ma sono ancora partizionati.
  • File system privato di origine
    L'API File System Access consente a un sito di leggere o salvare le modifiche apportate direttamente ai file e alle cartelle sul dispositivo dopo che l'utente concede l'accesso. Il file system privato di origine consente a un'origine di archiviare contenuti privati su disco, facilmente accessibili dall'utente e partizionati.
  • API Storage Bucket
    L'API Storage Bucket è in fase di sviluppo per lo standard Storage Standard, che consolida varie API di archiviazione, come IndexedDB e localStorage, utilizzando un nuovo concetto chiamato bucket. I dati archiviati nei bucket e i metadati associati ai bucket sono partizionati.
  • Intestazione Clear-Site-Data
    L'inclusione dell'intestazione Clear-Site-Data nella risposta consente a un server di richiedere la cancellazione dei dati memorizzati nel browser dell'utente. Puoi cancellare la cache, i cookie e lo spazio di archiviazione DOM. L'utilizzo dell'intestazione cancella solo lo spazio di archiviazione all'interno di una partizione.
  • Store URL BLOB
    Un blob è un oggetto che contiene dati non elaborati da elaborare ed è possibile generare un URL del blob per accedere alla risorsa. Gli archivi di URL BLOB non sono partizionati. Per supportare un caso d'uso per la navigazione in un contesto di primo livello a qualsiasi URL BLOB (Discussione), l'archivio URL BLOB potrebbe essere partizionato dal cluster di agenti anziché dal sito di primo livello. Questa funzionalità non è ancora disponibile per i test e il meccanismo di partizionamento potrebbe cambiare in futuro.

API di comunicazione

Insieme alle API di archiviazione, vengono partizionate anche le API di comunicazione che consentono a un contesto di comunicare attraverso i confini di origine. Le modifiche interessano principalmente le API che consentono il rilevamento di altri contesti tramite trasmissione o rendezvous con la stessa origine.

Per le seguenti API di comunicazione, gli iframe di terze parti non sono più in grado di comunicare con il proprio contesto della stessa origine:

  • Canale di trasmissione
    L'API Broadcast Channel consente la comunicazione tra contesti di navigazione (finestre, schede o iframe) e worker della stessa origine.
    Non si propone di modificare l'iframe cross-site postMessage() in cui la relazione tra contesti è chiaramente definita.
  • SharedWorker
    L'API SharedWorker fornisce un worker a cui è possibile accedere tra contesti di navigazione della stessa origine.
  • Blocchi web
    L'API Web Locks consente al codice in esecuzione in una scheda o in un worker della stessa origine di acquisire un blocco per una risorsa condivisa durante l'esecuzione di parte del lavoro.

API Service Worker

L'API Service Worker fornisce l'interfaccia per l'esecuzione delle attività in background. I siti creano registrazioni permanenti che creano un nuovo contesto worker per rispondere agli eventi e quel worker può comunicare con qualsiasi contesto della stessa origine. Inoltre, l'API Service Worker può modificare la tempistica delle richieste di navigazione, generando potenziali fughe di informazioni tra siti come lo sniffing della cronologia.

Pertanto, i service worker registrati da un contesto di terze parti sono partizionati.

API delle estensioni

Le estensioni sono programmi che consentono agli utenti di personalizzare la propria esperienza di navigazione.

Le pagine delle estensioni (pagine con schema chrome-extension://) possono essere incorporate nei siti web e, in questi casi, continueranno ad avere accesso alla partizione di primo livello. Queste pagine possono anche incorporare altri siti, nel qual caso questi siti avranno accesso alla loro partizione di primo livello, a condizione che l'estensione disponga delle autorizzazioni host per il sito.

Per ulteriori informazioni, consulta la documentazione relativa all'estensione.

Demo: testare il partizionamento dello spazio di archiviazione

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

Screenshot del sito dimostrativo che mostra tutti i segni di graduazione verdi sulla sinistra e le croci rosse sulla destra per ogni test.
Screenshot della demo che mostra l'output per un browser con il partizionamento dello spazio di archiviazione a sinistra e senza il partizionamento dello spazio di archiviazione a destra.

Nella demo vengono usati due siti: sito A e sito B.

  • Quando visiti il sito A nel contesto di primo livello, i dati vengono impostati utilizzando diversi metodi di archiviazione.
  • Il sito B incorpora una pagina del sito A, che tenta di leggere le opzioni di archiviazione impostate in precedenza.
  • Quando il sito A è incorporato nel sito B, non ha accesso a quei dati quando lo spazio di archiviazione è partizionato, quindi le letture non riescono.
  • La demo utilizza l'esito positivo o negativo di ogni lettura per mostrare se i dati sono partizionati.

Per il momento puoi disattivare il partizionamento dello spazio di archiviazione in Chrome impostando il flag di Chrome chrome://flags/#third-party-storage-partitioning su disabled per confermare che non supera il test di partizionamento.

Puoi anche testare altri browser nello stesso modo per verificarne lo stato di partizionamento.

Interagisci e condividi feedback