Pubblicato il 4 maggio 2020
Nell'articolo Rendere il tuo sito web "con isolamento multiorigine" utilizzando COOP e COEP abbiamo spiegato come adottare lo stato "con isolamento multiorigine" utilizzando COOP e COEP. Questo è un articolo complementare che spiega perché è necessario l'isolamento cross-origin per abilitare funzionalità avanzate nel browser.
Glossario
Questo documento utilizza molti termini con nomi e abbreviazioni simili. Per maggiore chiarezza, abbiamo curato un mini glossario:
- COEP: Cross Origin Embedder Policy
- COOP: Cross Origin Opener Policy
- CORP: Cross Origin Resource Policy
- CORS: Cross Origin Resource Sharing
- CORB: Cross Origin Read Blocking
Sfondo
Il web si basa sulla policy della stessa origine, una
funzionalità di sicurezza che limita il modo in cui documenti e script possono interagire con le
risorse di un'altra origine. Questo principio limita i modi in cui i siti web possono accedere alle risorse multiorigine. Ad esempio, un documento di https://a.example non può accedere ai dati ospitati su https://b.example.
Tuttavia, la policy della stessa origine ha avuto alcune eccezioni storiche. Qualsiasi sito web può:
- Incorporare iframe multiorigine
- Includere risorse multiorigine come immagini o script
- Aprire finestre di dialogo multiorigine con un riferimento DOM
Quando la community web si è resa conto dei vantaggi di una policy della stessa origine rigorosa, il web si basava già su queste eccezioni.
Gli effetti collaterali sulla sicurezza di una policy della stessa origine così permissiva sono stati corretti in due modi:
- Il protocollo CORS (Cross Origin Resource Sharing) garantisce che il server consenta la condivisione di una risorsa con una determinata origine.
- Gli sviluppatori rimuovono implicitamente l'accesso diretto agli script alle risorse multiorigine, mantenendo al contempo la compatibilità con le versioni precedenti. Queste risorse multiorigine sono chiamate risorse "opache". Questo è il motivo per cui la manipolazione dei pixel multiorigine con
CanvasRenderingContext2Dnon riesce a meno che CORS non venga applicato all'immagine.
Tutte queste decisioni relative alle policy vengono prese all'interno di un gruppo di contesti di navigazione.

Per molto tempo, questa combinazione è stata sufficiente per proteggere i browser, con casi limite limitati che richiedevano patch dirette (come le vulnerabilità JSON).
La situazione è cambiata con
Spectre, che
rende potenzialmente leggibili tutti i dati caricati nello stesso gruppo di contesti di navigazione del tuo codice. Misurando il tempo impiegato per determinate operazioni, gli autori degli attacchi possono indovinare i contenuti delle cache della CPU e, di conseguenza, i contenuti della memoria del processo. Questi attacchi sono possibili con timer a bassa granularità esistenti nella piattaforma e possono essere accelerati con timer ad alta granularità, sia espliciti (come performance.now()) sia impliciti (come SharedArrayBuffer).
Se evil.com incorpora un'immagine multiorigine, può utilizzare un attacco Spectre per leggere i dati dei pixel dell'immagine incorporata. In questo modo, le protezioni che si basano sull'"opacità" diventano inefficaci.

Idealmente, tutte le richieste multiorigine vengono esaminate dal server proprietario della risorsa. Se l'esame non è stato eseguito, i dati non devono mai raggiungere il gruppo di contesti di navigazione di un attore malintenzionato. In questo modo, i dati rimangono fuori dalla portata di possibili attacchi Spectre. Questo stato è chiamato stato con isolamento multiorigine.
Quando il codice incorporato è in uno stato con isolamento multiorigine, il sito richiedente è considerato meno pericoloso. In questo modo, il sito richiedente può utilizzare
SharedArrayBuffer, performance.measureUserAgentSpecificMemory() e
timer ad alta risoluzione con una precisione migliore,
impedendo al contempo possibili attacchi Spectre. Questo stato impedisce anche la modifica di document.domain.
Policy sull'incorporamento multiorigine
La policy sull'incorporamento multiorigine (COEP) impedisce a un documento di caricare risorse cross-origin che non concedono esplicitamente l'autorizzazione al documento con CORP o CORS. Con questa funzionalità, puoi dichiarare che un documento non può caricare queste risorse.
a.example,
ha impostato la policy COEP su require-corp. a.example vuole incorporare 3 asset da b.example, ma solo due hanno esito positivo.
I due incorporamenti riusciti includono un file JavaScript con una policy CORP multiorigine e un'immagine con CORS consentito. La terza risorsa è un video con una policy CORP che richiede che la risorsa venga incorporata solo nella stessa origine, pertanto il video non verrà caricato su a.example.
Per attivare questa policy, aggiungi la seguente intestazione HTTP al documento:
Cross-Origin-Embedder-Policy: require-corp
COEP accetta un singolo valore di require-corp. Questo applica la policy in base alla quale il documento può 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 la policy sulle risorse tra origini (CORP).
Condivisione delle risorse tra origini
Se una risorsa cross-origin supporta la condivisione delle risorse tra origini
(CORS), puoi utilizzare l'
crossorigin
attributo
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 le intestazioni CORS, utilizza l'
crossorigin attributo in modo che la richiesta di recupero della risorsa utilizzi la modalità CORS. Inoltre, l'immagine non verrà caricata a meno che non imposti le intestazioni CORS.
Allo stesso modo, puoi recuperare i dati cross-origin tramite il metodo fetch(), che
non richiede una gestione speciale a condizione che il server risponda con le intestazioni
HTTP
corrette.
Policy sulle risorse tra origini
La policy sulle risorse tra origini (CORP) è stata introdotta originariamente come opzione di attivazione per proteggere le risorse dal caricamento da parte di un'altra origine. Nel contesto di COEP, CORP può specificare la policy del proprietario della risorsa per chi può caricare una risorsa.
L'intestazione Cross-Origin-Resource-Policy accetta tre valori possibili:
Cross-Origin-Resource-Policy: same-site
Le risorse contrassegnate con 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 alla
specifica CORP insieme a COEP.)
Criteri di apertura multiorigine
La policy Cross Origin Opener Policy
(COOP) consente di isolare una
finestra di primo livello da altri documenti inserendo i documenti in un gruppo di contesti di navigazione separato. In questo modo, i documenti non possono interagire direttamente con la finestra di primo livello. Ad esempio, se un documento con COOP apre una finestra di dialogo, la relativa proprietà window.opener è null. La proprietà .closed del riferimento dell'apertura è true.

L'intestazione Cross-Origin-Opener-Policy accetta 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 esplicitamente 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 tutti i popup che non impostano COOP o che disattivano l'isolamento impostando un COOP di unsafe-none.

Cross-Origin-Opener-Policy: unsafe-none
unsafe-none è il valore predefinito e consente di aggiungere il documento al gruppo di contesti di navigazione dell'apertura, a meno che l'apertura stessa non abbia un COOP di same-origin.
Riepilogo
Se vuoi accedere a funzionalità come SharedArrayBuffer,
performance.measureUserAgentSpecificMemory() o timer ad alta risoluzione con una precisione migliore,
il documento deve utilizzare sia COEP con il valore require-corp sia
COOP con il valore same-origin. In assenza di uno dei due, il browser non garantirà un isolamento sufficiente per abilitare in sicurezza queste potenti funzionalità.
Puoi determinare la situazione della tua pagina controllando se
self.crossOriginIsolated
restituisce true.
Scopri come implementare questa funzionalità in Rendere il tuo sito web "cross-origin isolated" utilizzando COOP e COEP.