Scopri perché l'isolamento multiorigine è necessario per utilizzare funzionalità avanzate come SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
e il timer ad alta risoluzione con una precisione migliore.
Introduzione
In Rendere il tuo sito web "cross-origin isolated" utilizzando COOP e COEP abbiamo spiegato come adottare lo stato "cross-origin isolated" utilizzando COOP e COEP. Questo articolo complementare spiega perché l'isolamento multiorigine è necessario per attivare funzionalità avanzate nel browser.
Sfondo
Il web si basa sul criterio della stessa origine: una funzionalità di sicurezza che limita il modo in cui documenti e script possono interagire con risorse provenienti da 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, il criterio della stessa origine ha avuto alcune eccezioni storiche. Qualsiasi sito web può:
- Incorporare iframe multiorigine
- Includere risorse multiorigine come immagini o script
- Apri finestre popup multiorigine con un riferimento DOM
Se il web potesse essere progettato da zero, queste eccezioni non esisterebbero. Purtroppo, quando la community web si è resa conto dei vantaggi principali di una rigida policy di origine uguale, il web si basava già su queste eccezioni.
Gli effetti collaterali sulla sicurezza di un criterio della stessa origine così blando 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 è garantire che il server consenta la condivisione di una risorsa con una determinata origine. L'altro modo è rimuovere implicitamente l'accesso diretto agli script alle risorse multiorigine preservando la compatibilità con le versioni precedenti. Queste
risorse multiorigine sono chiamate risorse "opache". Ad esempio, questo è il motivo per cui
la manipolazione dei pixel di un'immagine multiorigine 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 contesti di navigazione.
Per molto tempo, la combinazione di CORS e risorse opache è stata sufficiente a rendere i browser sicuri. A volte sono stati scoperti casi limite (come le 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 multiorigine ha funzionato.
Tutto è cambiato con
Spectre, che
rende potenzialmente leggibili tutti i dati caricati nello stesso gruppo di contesti di navigazione del tuo codice. Misurando il tempo impiegato da 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 di temporizzazione sono possibili con timer a bassa granularità
presenti nella piattaforma, ma 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, il che rende inefficaci le protezioni che si basano sull'"opacità".
Idealmente, tutte le richieste multiorigine devono essere esaminate esplicitamente dal server proprietario della risorsa. Se la verifica non viene fornita dal server proprietario delle risorse, 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 di isolamento multiorigine. Questo è esattamente lo scopo di COOP+COEP.
In uno stato di isolamento cross-origin, il sito richiedente è considerato meno
pericoloso e questo sblocca potenti funzionalità come SharedArrayBuffer
,
performance.measureUserAgentSpecificMemory()
e timer ad alta risoluzione con una precisione migliore, che altrimenti potrebbero
essere utilizzati per attacchi simili a Spectre. Inoltre, impedisce la modifica di
document.domain
.
Policy sull'incorporamento multiorigine
La policy sull'incorporamento multiorigine (COEP) impedisce a un documento di caricare risorse multiorigine 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 questa norma, aggiungi la seguente intestazione HTTP al documento:
Cross-Origin-Embedder-Policy: require-corp
COEP accetta un unico valore di require-corp
. In questo modo viene applicato il criterio secondo cui il
documento può caricare solo risorse della stessa origine o risorse esplicitamente
contrassegnate 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 delle risorse multiorigine (CORP).
Condivisione delle risorse tra origini (CORS)
Se una risorsa multiorigine 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 le 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 imposti le intestazioni CORS.
Norme sulle risorse multiorigine
Cross Origin Resource Policy (CORP) è stata originariamente introdotta come funzionalità attivabile per proteggere le risorse dal caricamento da parte di un'altra origine. Nel contesto di COEP, CORP può specificare i criteri 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 COOP (Cross-Origin-Opener-Policy) ti consente di assicurarti che una finestra di primo livello sia isolata da altri documenti inserendoli in un gruppo di contesti 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 relativa proprietà
window.opener
sarà null
. Inoltre, la proprietà .closed
del riferimento
all'apertura restituirà 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 documenti della stessa origine anch'essi contrassegnati in modo esplicito con same-origin
.
Cross-Origin-Opener-Policy: same-origin-allow-popups
Un documento di primo livello con same-origin-allow-popups
mantiene i riferimenti a uno qualsiasi dei suoi popup che non impostano COOP o che disattivano l'isolamento impostando un valore 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 un accesso garantito a funzionalità avanzate come SharedArrayBuffer
,
performance.measureUserAgentSpecificMemory()
o timer ad alta risoluzione con una precisione migliore, ricorda
che il documento deve utilizzare sia COEP con il valore require-corp
sia
COOP con il valore same-origin
. In assenza di entrambi, il browser
non garantisce un isolamento sufficiente per attivare in sicurezza queste potenti funzionalità. Puoi determinare la situazione della tua pagina controllando se
self.crossOriginIsolated
restituisce true
.
Scopri i passaggi per implementare questa funzionalità in Rendere il tuo sito web "cross-origin isolated" utilizzando COOP e COEP.