Perché hai bisogno di un'opzione "con isolamento multiorigine" per funzionalità avanzate

Scopri perché è necessario l'isolamento multiorigine per utilizzare funzionalità potenti come SharedArrayBuffer, performance.measureUserAgentSpecificMemory() e il timer ad alta risoluzione con una maggiore precisione.

Introduzione

In Rendere il tuo sito web "isolato cross-origin" utilizzando COOP e COEP abbiamo spiegato come adottare lo stato "isolato cross-origin" utilizzando COOP e COEP. Questo è un articolo complementare che spiega perché l'isolamento multiorigine è necessario per attivare funzionalità potenti nel browser.

Sfondo

Il web si basa sul criterio della stessa origine: una funzionalità di sicurezza che limita il modo in cui i documenti e gli script possono interagire con le risorse di un'altra origine. Questo principio limita i modi in cui i siti web possono accedere alle risorse cross-origin. ad esempio, a un documento di https://a.example viene impedito di accedere ai dati ospitati su https://b.example.

Tuttavia, il criterio della stessa origine ha avuto alcune eccezioni storiche. Qualsiasi sito web può:

  • Incorporare iframe multiorigine
  • Includi risorse cross-origin come immagini o script
  • Aprire finestre popup cross-origin con un riferimento DOM

Se il web potesse essere progettato da zero, queste eccezioni non esisterebbero. Purtroppo, quando la community web ha compreso i vantaggi principali di un criterio di origine rigorosamente uguale, il web si basava già su queste eccezioni.

I problemi di sicurezza derivanti da un criterio della stessa origine così permissivo sono stati corretti in due modi. Un modo è stato l'introduzione di un nuovo protocollo chiamato condivisione delle risorse tra origini (CORS), il cui scopo è assicurarsi che il server consenta la condivisione di una risorsa con una determinata origine. L'altro modo consiste nel rimuovere implicitamente l'accesso diretto allo script alle risorse cross-origin, preservando al contempo la compatibilità con le versioni precedenti. Queste risorse cross-origin sono chiamate risorse "opache". Ad esempio, è per questo che la manipolazione dei pixel di un'immagine cross-origin tramite CanvasRenderingContext2D non va a buon fine, a meno che non venga applicato CORS all'immagine.

Tutte queste decisioni relative alle norme vengono prese all'interno di un gruppo di contesto di navigazione.

Gruppo di contesti di navigazione

Per molto tempo, la combinazione di CORS e risorse opache è stata sufficiente per rendere sicuri i browser. A volte sono stati scoperti casi limite (ad esempio vulnerabilità JSON) che dovevano essere corretti, ma nel complesso il principio di non consentire l'accesso in lettura diretto ai byte non elaborati delle risorse cross-origin è stato efficace.

Tutto è cambiato con Spectre, che rende potenzialmente leggibili tutti i dati caricati nello stesso gruppo di contesto di navigazione del codice. Misurando il tempo necessario per determinate operazioni, gli attaccanti possono indovinare i contenuti delle cache della CPU e, di conseguenza, i contenuti della memoria del processo. Questi attacchi di temporizzazione sono possibili con i timer a bassa granularità esistenti nella piattaforma, ma possono essere accelerati con i timer ad alta granularità, sia espliciti (come performance.now()) che impliciti (come SharedArrayBuffer). Se evil.com incorpora un'immagine cross-origin, può utilizzare un attacco Spectre per leggere i dati dei pixel, il che rende inefficaci le protezioni basate sull'"opacità".

Spectr

Idealmente, tutte le richieste cross-origin dovrebbero essere sottoposte a verifica esplicita da parte del server proprietario della risorsa. Se il controllo non viene fornito dal server proprietario della risorsa, i dati non entreranno mai nel gruppo di contesti di navigazione di un malintenzionato e quindi rimarranno fuori dalla portata di qualsiasi attacco Spectre che una pagina web potrebbe eseguire. Lo chiamiamo stato con isolamento multiorigine. È esattamente ciò che si propone COOP+COEP.

In uno stato di isolamento cross-origin, il sito che effettua la richiesta è considerato meno pericoloso e questo sblocca funzionalità potenti come SharedArrayBuffer, performance.measureUserAgentSpecificMemory() e tempi con alta risoluzione con una precisione migliore che altrimenti potrebbe essere utilizzata per attacchi simili a Spectre. Inoltre, impedisce la modifica document.domain.

Norme sull'incorporamento multiorigine

I Criteri sull'incorporamento multiorigine (COEP) impediscono a un documento di caricare risorse cross-origin che non concedono esplicitamente l'autorizzazione al documento (utilizzando CORP o CORS). Con questa funzionalità, puoi dichiarare che un documento non può caricare queste risorse.

Come funziona il COEP

Per attivare questo criterio, aggiungi al documento la seguente intestazione HTTP:

Cross-Origin-Embedder-Policy: require-corp

La parola chiave require-corp è l'unico valore accettato per COEP. In questo modo viene applicato il criterio che consente al documento di caricare solo risorse della stessa origine o risorse contrassegnate esplicitamente come caricabili da un'altra origine.

Affinché le risorse siano caricabili da un'altra origine, devono supportare la Condivisione delle risorse tra origini (CORS) o il criterio delle risorse multiorigine (CORP).

Condivisione delle risorse tra origini (CORS)

Se una risorsa cross-origin supporta la condivisione delle risorse tra origini (CORS), puoi utilizzare l'attributo crossorigin per caricarla nella tua pagina web senza che venga bloccata da COEP.

<img src="https://third-party.example.com/image.jpg" crossorigin>

Ad esempio, se questa risorsa immagine viene pubblicata con intestazioni CORS, utilizza l'attributo crossorigin in modo che la richiesta di recupero della risorsa utilizzi la modalità CORS. Inoltre, impedisce il caricamento dell'immagine, a meno che non vengano impostate le intestazioni CORS.

Analogamente, puoi recuperare i dati di più origini tramite il metodo fetch(), che non richiede una gestione speciale purché il server risponda con le intestazioni HTTP corrette.

Cross-Origin Resource Policy

I criteri delle risorse cross-origin (CORP) sono stati inizialmente introdotti come opzione da attivare per proteggere le risorse dal caricamento da un'altra origine. Nel contesto di COEP, CORP può specificare il criterio del proprietario della risorsa per chi può caricare una risorsa.

L'intestazione Cross-Origin-Resource-Policy può avere tre valori possibili:

Cross-Origin-Resource-Policy: same-site

Le risorse contrassegnate da same-site possono essere caricate solo dallo stesso sito.

Cross-Origin-Resource-Policy: same-origin

Le risorse contrassegnate con same-origin possono essere caricate solo dalla stessa origine.

Cross-Origin-Resource-Policy: cross-origin

Le risorse contrassegnate con cross-origin possono essere caricate da qualsiasi sito web. Questo valore è stato aggiunto alle specifiche CORP insieme a COEP.

Norme di apertura multiorigine

Il Cross Origin Opener Policy (COOP) ti consente di assicurarti che una finestra di primo livello sia isolata dagli altri documenti inserendoli in un gruppo di contesto di navigazione diverso, in modo che non possano interagire direttamente con la finestra di primo livello. Ad esempio, se un documento con COOP apre un popup, la proprietà window.opener sarà null. Inoltre, la proprietà .closed del riferimento dell'apridocumento restituirà true.

COOP

L'intestazione Cross-Origin-Opener-Policy può avere tre valori possibili:

Cross-Origin-Opener-Policy: same-origin

I documenti contrassegnati con same-origin possono condividere lo stesso gruppo di contesti di navigazione con i documenti della stessa origine contrassegnati anche in modo esplicito con same-origin.

COOP

Cross-Origin-Opener-Policy: same-origin-allow-popups

Un documento di primo livello con same-origin-allow-popups conserva i riferimenti a qualsiasi popup che non imposta COOP o che disattiva l'isolamento impostando un valore COOP pari a same-origin-allow-popups.unsafe-none

COOP

Cross-Origin-Opener-Policy: unsafe-none

unsafe-none è il valore predefinito e consente di aggiungere il documento al gruppo di contesto di navigazione dell'utente che lo ha aperto, a meno che l'utente stesso non abbia un valore COOP pari a same-origin.

Riepilogo

Se vuoi avere accesso garantito a funzionalità potenti come SharedArrayBuffer, performance.measureUserAgentSpecificMemory() o tempi con alta risoluzione con una maggiore precisione, ricordati che il tuo documento deve utilizzare sia COEP con il valore require-corp sia COOP con il valore same-origin. In assenza di una di queste, il browser non garantirà un isolamento sufficiente per attivare in sicurezza queste potenti funzionalità. Puoi determinare la situazione della tua pagina controllando se self.crossOriginIsolated restituisce true.

Per scoprire come implementare questa funzionalità, consulta la sezione Creare un sito web "isolato tra origini" utilizzando COOP e COEP.

Risorse