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.
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à".
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.
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
.
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
.
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
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.