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

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

Introduzione

Nella sezione Rendere il sito web "isolato multiorigine" utilizzando COOP COEP abbiamo spiegato come adottare il modello "cross-origin" isolata" utilizzando COOP e COEP. Questo è un articolo complementare che spiega perché è necessario l'isolamento multiorigine per abilitare funzionalità efficaci nel browser.

Sfondo

Il web è basato sulla stessa origine : una funzionalità di sicurezza che limita il modo in cui documenti e script possono interagire con risorse di un'altra origine. Questo limita i modi in cui i siti web possono accedere alle risorse multiorigine. Per Ad esempio, a un documento da https://a.example non è consentito l'accesso ai dati ospitato presso https://b.example.

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

  • Incorpora iframe multiorigine
  • Includi 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. Sfortunatamente, quando la community web ha capito i principali vantaggi di una il criterio della stessa origine, il web si basava già su queste eccezioni.

Gli effetti collaterali sulla sicurezza di una politica permissiva della stessa origine sono stati risolti in due in molti modi diversi. Un modo è stato l'introduzione di un nuovo protocollo chiamato Cross Condivisione delle risorse di origine (CORS) il cui scopo è assicurarsi che il server consenta la condivisione di una risorsa con una data origine. L'altro modo è rimuovere implicitamente l'accesso diretto allo script multiorigine, preservando la compatibilità con le versioni precedenti. Tale Le risorse multiorigine sono chiamate "opache" Google Cloud. Ecco perché, ad esempio, manipolazione dei pixel di un'immagine multiorigine tramite CanvasRenderingContext2D non riesce a meno che non venga applicato CORS all'immagine.

Tutte queste decisioni relative ai criteri avvengono all'interno di un gruppo di contesto di navigazione.

Gruppo di contesto di navigazione

Per molto tempo, la combinazione di risorse CORS e opaque è stata sufficiente per browser sicuri. A volte casi limite (come JSON vulnerabilità) e aveva bisogno di una patch, ma nel complesso il principio di non che consentisse l'accesso diretto in lettura ai byte non elaborati delle risorse multiorigine riuscito.

Tutto è cambiato con Spectre, che crea tutti i dati caricati nello stesso gruppo di contesti di navigazione del codice potenzialmente leggibili. Misurando il tempo impiegato da determinate operazioni, gli aggressori può indovinare i contenuti delle cache della CPU e, di conseguenza, i contenuti dei processo" la memoria. Tali attacchi a tempo sono possibili con timer a bassa granularità presenti nella piattaforma, ma che possono essere accelerati con timer ad alta granularità, espliciti (ad es. performance.now()) e impliciti (ad es. SharedArrayBuffer). Se evil.com incorpora un'immagine multiorigine, può utilizzare un'immagine Spectre per leggere i dati dei pixel, il che fa affidamento sulle protezioni "opacità" inefficaci.

Spettro

Idealmente, tutte le richieste multiorigine dovrebbero essere esplicitamente controllate dal server proprietario della risorsa. Se la verifica non è fornita da il server che possiede le risorse, i dati non verranno mai inseriti nella gruppo di contesto di un malvagio aggressore, rimanendo così fuori dalla portata di Spettro attacchi che una pagina web potrebbe effettuare. Viene chiamato stato isolato multiorigine. Questo è esattamente lo scopo di COOP+COEP.

In uno stato di isolamento multiorigine, il sito richiedente è considerato meno indicato pericoloso, che sblocca funzionalità potenti come SharedArrayBuffer, performance.measureUserAgentSpecificMemory() e alta risoluzione automaticamente con maggiore precisione, il che potrebbe altrimenti usato per attacchi simili a Spectre. Inoltre, impedisce di modificare document.domain.

Criterio di incorporamento multiorigine

Incorporatore multiorigine (COEP) impedisce che di non caricare risorse multiorigine che non concedono in modo esplicito l'autorizzazione di accesso ai documenti (utilizzando CORP o CORS). Con questa funzione, puoi dichiarare impossibile caricare queste risorse da un documento.

Come funziona il COEP

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

Cross-Origin-Embedder-Policy: require-corp

La parola chiave require-corp è l'unico valore accettato per il COEP. Questa operazione applica il criterio secondo cui il documento può caricare risorse solo dalla stessa origine oppure di risorse contrassegnate esplicitamente come caricabili da un'altra origine.

Affinché le risorse possano essere caricate da un'altra origine, devono supportare Condivisione delle risorse tra origini (CORS) o criteri delle risorse tra origini (CORP).

Condivisione delle risorse tra origini

Se una risorsa multiorigine supporta la condivisione delle risorse tra origini (CORS), puoi utilizzare crossorigin: attributo per caricarlo sulla tua pagina web senza essere bloccato dal COEP.

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

Ad esempio, se questa risorsa immagine viene fornita con intestazioni CORS, utilizza la classe crossorigin in modo che la richiesta di recupero della risorsa utilizzi CORS predefinita. Anche questo impedisce il caricamento dell'immagine a meno che non vengano impostate intestazioni CORS.

Allo stesso modo, puoi recuperare dati multiorigine tramite il metodo fetch(), che non richiede una gestione speciale purché il server risponda con il giusto HTTP intestazioni.

Criterio delle risorse tra origini

Criteri delle risorse tra origini (CORP) è stato originariamente introdotto come opzione di attivazione per impedire che le risorse caricato da un'altra origine. Nel contesto del COEP, CORP può specificare la risorsa il criterio del proprietario per specificare 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 come cross-origin possono essere caricate da qualsiasi sito web. (Questo predefinito è stato aggiunto specifica CORP insieme a COEP.)

Criterio di apertura multiorigine

Criterio di apertura multiorigine (COOP) ti consente di assicurarti che una finestra di primo livello viene isolata dagli altri documenti inserendoli in una gruppo di contesti di navigazione diverso, in modo che non possano interagire direttamente finestra di primo livello. Ad esempio, se un documento contenente COOP apre un popup, La proprietà window.opener verrà null. Inoltre, la proprietà .closed del metodo il riferimento di apertura a quest'ultimo 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 contesto di navigazione gruppo con documenti della stessa origine contrassegnati in modo esplicito come 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 dei popup che non impostano COOP o che disattivano l'isolamento l'impostazione di un COOP di unsafe-none.

COOP

Cross-Origin-Opener-Policy: unsafe-none

unsafe-none è l'impostazione predefinita e consente di aggiungere il documento a quello di apertura navigazione del gruppo di contesti, a meno che l'apertura stessa non abbia una COOP di same-origin.

Riepilogo

Se vuoi avere accesso garantito a funzionalità avanzate come SharedArrayBuffer, performance.measureUserAgentSpecificMemory() o alta risoluzione i timer con maggiore precisione, ricorda che il documento deve utilizzare sia COEP con valore require-corp che COOP con il valore di same-origin. In assenza di entrambe le opzioni, il browser non garantire un isolamento sufficiente per attivare in sicurezza queste potenti funzionalità. Tu puoi stabilire la situazione della tua pagina controllando se self.crossOriginIsolated restituisce true.

Per scoprire i passaggi per implementarla, vedi Rendere il sito web "multiorigine" isolata" utilizzando COOP e COEP.

Risorse