Partizionamento dello spazio di archiviazione

Per impedire determinati tipi di monitoraggio tra siti laterale, Chrome ha partitioned la maggior parte delle API di archiviazione e comunicazione in contesti di terze parti.

Stato dell'implementazione

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

Che cos'è il partizionamento dello spazio di archiviazione?

Per impedire alcuni tipi di monitoraggio tra siti laterale, Chrome sta partizionando le API di archiviazione e comunicazione in contesti di terze parti.

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

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

In genere, la partizione significa che i dati archiviati dalle API di archiviazione come l'archiviazione locale e IndexedDB da un iframe non sono più accessibili a tutti i contesti nella stessa origine. I dati sono invece disponibili solo per i 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 può accedere allo spazio di archiviazione di example.com se incorporato in a.com.

Partizionamento dello spazio di archiviazione su iframe incatenati

Quando un iframe contiene un iframe, la situazione inizia a complicarsi. Questo accade soprattutto 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 entrambi A1 e A2 si trovano sullo stesso sito. Se durante la suddivisione prendiamo in considerazione solo i contesti di primo livello e di livello corrente, l'iframe A2 potrebbe essere considerato di proprietà dell'editore perché si trova nello stesso sito del livello di primo livello (A1) nonostante l'iframe di terze parti (B) intermedio. Ciò potrebbe esporre A2 a rischi di sicurezza come il clickjacking se A2 avesse accesso allo spazio di archiviazione non partizionato per impostazione predefinita.

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

Se la catena non contiene un contesto cross-site, lo spazio di archiviazione non viene partizionato. Ad esempio, il sito A1 contenente un iframe per A2 che contiene un iframe per A3 non verrebbe partizionato per A1, A2 o A3 poiché si trovano tutti nello stesso sito.

Per i siti che richiedono l'accesso non partizionato tra iframe incatenati, Chrome sta sperimentando l'estensione dell'API Accesso allo spazio di archiviazione per abilitare questo caso d'uso. Poiché l'API Accesso allo spazio di archiviazione richiede che il sito incorniciato richiami esplicitamente l'API, il rischio di clickjacking viene ridotto.

API aggiornate

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

API di archiviazione

  • Sistema di quote
    Il sistema di quote viene utilizzato per determinare la quantità di spazio su disco allocata per lo spazio di archiviazione. Il sistema di quote gestisce ogni partizione come un bucket separato per determinare lo spazio consentito e quando viene cleared.
    La funzione navigator.storage.estimate() restituisce le informazioni della partizione. Le API solo per Chrome, come window.webkitStorageInfo e navigator.webkitTemporaryStorage, verranno ritirate.
    IndexedDB e lo spazio di archiviazione della cache utilizzano il nuovo sistema di quote partizionato.
  • API Web Storage
    L'API Web Storage fornisce i meccanismi con cui i browser possono memorizzare coppie chiave/valore. Esistono due meccanismi: Memoria locale e Memoria di sessione. Al momento non sono gestiti in base alla quota, ma sono comunque suddivisi.
  • File system privato di Origin
    L'API Accesso al file system consente a un sito di leggere o salvare le modifiche direttamente in file e cartelle sul dispositivo dopo che l'utente ha concesso l'accesso. Origin Private File System consente a un'origine di archiviare su disco contenuti privati a cui l'utente può accedere facilmente e che sono suddivisi in partizioni.
  • API Storage Bucket
    L'API Storage Bucket è in fase di sviluppo per 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 vengono suddivisi in parti.
  • Intestazione Clear-Site-Data
    L'inclusione dell'intestazione Clear-Site-Data nella risposta consente a un server di richiedere l'eliminazione dei dati memorizzati nel browser dell'utente. È possibile svuotare la cache, eliminare i cookie e lo spazio di archiviazione DOM. L'utilizzo dell'intestazione consente di cancellare lo spazio di archiviazione solo all'interno di una partizione.
  • Archiviazione di URL di blob
    Un blob è un oggetto che contiene dati non elaborati da elaborare ed è possibile generare un URL blob per accedere alla risorsa. Gli URL dei blob non sono partizionati. Per supportare un caso d'uso per la navigazione in un contesto di primo livello a qualsiasi URL del blob (discussione), l'URL del blob dello spazio di archiviazione potrebbe essere partizionato in base al cluster di agenti anziché al sito di primo livello. Questa funzionalità non è ancora disponibile per i test e il meccanismo di partizione potrebbe cambiare in futuro.

API di comunicazione

Oltre alle API di archiviazione, vengono partizionate anche le API di comunicazione che consentono a un contesto di comunicare oltre i confini delle origini. Le modifiche riguardano principalmente le API che consentono la scoperta di altri contesti tramite trasmissione o riunione dello stesso indirizzo.

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

  • Broadcast Channel
    L'API Broadcast Channel consente la comunicazione tra contesti di navigazione (finestre, schede o iframe) e worker della stessa origine.
    Non è prevista la modifica degli iframe cross-site postMessage() in cui la relazione tra i contesti è chiaramente definita.
  • SharedWorker
    L'API SharedWorker fornisce un worker a cui è possibile accedere in diversi contesti di navigazione della stessa origine.
  • Serrature 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 un determinato lavoro.

API Service Worker

L'API Service Worker fornisce l'interfaccia per eseguire attività in background. I siti creano registrazioni permanenti che generano un nuovo contesto di worker per rispondere agli eventi e questo worker può comunicare con qualsiasi contesto dello stesso origine. Inoltre, l'API Service Worker può modificare la tempistica delle richieste di navigazione, con il potenziale rischio di fughe di informazioni tra siti, come lo sniffing della cronologia.

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

API di estensione

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

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

Per saperne di più, consulta la documentazione dell'estensione.

Demo: test del partizionamento dello spazio di archiviazione

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

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

La demo utilizza due siti: il sito A e il sito B.

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

Per il momento, puoi disattivare il partizionamento dello spazio di archiviazione in Chrome utilizzando il --disable-features=ThirdPartyStoragePartitioning parametro a riga di comando.

Puoi anche testare altri browser nello stesso modo per vedere il loro stato di partizione.

Coinvolgere e condividere feedback