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

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.

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

Spectr

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.

Come funziona COEP

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.

Allo stesso modo, puoi recuperare dati multiorigine tramite il metodo fetch(), che non richiede una gestione speciale, a condizione che il server risponda con le intestazioni HTTP corrette.

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.

COOP

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.

COOP

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.

COOP

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.

Risorse