Che cos'è l'header Cross-Origin-Opener-Policy e perché è importante?
L'header Cross-Origin-Opener-Policy, di solito scritto COOP, è un header di risposta che controlla se la tua pagina condivide una relazione di finestra con pagine di altre origini. Impostato su same-origin, isola il tuo documento in un proprio browsing context group, così che una pagina di un'altra origine che apre la tua, o che tu apri, non possa mantenere alcun riferimento scriptabile verso la tua finestra. Questo chiude una classe di attacchi cross-origin noti come XS-Leaks e attacchi side-channel, ed è inoltre l'impostazione che sblocca alcune potenti funzionalità del browser.
Perché esiste l'header Cross-Origin-Opener-Policy?
COOP esiste perché l'apertura di una finestra crea un collegamento che può essere abusato. Quando una pagina ne apre un'altra con window.open(), o una pagina apre la tua, il browser può mantenere un riferimento tra le due finestre tramite la proprietà window.opener. Se queste due pagine provengono da origini diverse, quel riferimento diventa una via attraverso cui una pagina cross-origin può sondare la tua.
Gli attacchi che questo rende possibili sono sottili. Non rubano i tuoi dati direttamente, ma li deducono tramite side channel, timing e stato del browser condiviso, in una famiglia di tecniche che la comunità della sicurezza chiama XS-Leaks. Secondo la documentazione di Mozilla, COOP è stato introdotto proprio perché un sito possa garantire che il proprio documento di primo livello non condivida un browsing context group con documenti cross-origin, ed è esattamente ciò che recide quel riferimento e chiude la via.
Che cosa fa davvero l'header Cross-Origin-Opener-Policy?
COOP decide se il tuo documento e le pagine con cui interagisce appartengono allo stesso browsing context group, il concetto interno al browser che determina se due finestre possono scriptarsi a vicenda. Quando lo imposti in modo rigoroso, la tua finestra entra in un proprio gruppo e ogni finestra cross-origin perde il suo riferimento verso la tua.
L'header ha un piccolo insieme di valori. Il valore predefinito, unsafe-none, non applica alcun isolamento e lascia che il tuo documento condivida un browsing context group con pagine cross-origin. Il valore rigoroso, same-origin, isola il tuo documento in modo che solo le pagine della stessa origine che impostano anch'esse same-origin possano restare nello stesso gruppo. Un valore intermedio, same-origin-allow-popups, mantiene quell'isolamento ma lascia funzionare normalmente i popup che apri deliberatamente, la scelta pratica per i siti che dipendono da flussi tramite popup come il pagamento o il single sign-on. Quando una finestra cross-origin viene aperta sotto same-origin, il suo window.opener diventa null, così il riferimento semplicemente non esiste.
Cosa succede se non lo imposti?
Senza COOP il valore predefinito è unsafe-none, il che significa nessun isolamento e il riferimento di finestra che resta aperto. Una pagina cross-origin che apre la tua, o che tu apri, può mantenere una presa sulla tua finestra e usarla come punto d'appoggio per le tecniche side-channel descritte sopra.
Questa è una lacuna silenziosa, non rumorosa. Nulla sul tuo sito sembra rotto, e la maggior parte dei visitatori non la attiverà mai, ed è proprio per questo che spesso resta non affrontata. Ma per un sito che tratta qualcosa di sensibile, un login, un portale pazienti, un passaggio di pagamento, lasciare aperta la relazione di finestra è un'esposizione evitabile, ed è una che scanner di sicurezza e audit segnalano sempre più come header mancante.
Come implementi l'header Cross-Origin-Opener-Policy?
Imposti COOP come un singolo header di risposta HTTP. Per la maggior parte dei siti il valore di partenza giusto è Cross-Origin-Opener-Policy: same-origin-allow-popups, che ti dà l'isolamento preservando i flussi tramite popup; un sito senza tali dipendenze può passare al più rigoroso same-origin. Può essere aggiunto sul web server, nel livello applicativo, o al margine in un CDN o in un livello di sicurezza posto davanti al sito.
L'unica raccomandazione forte è: testa prima di imporre. COOP supporta una modalità report-only, inviata come Cross-Origin-Opener-Policy-Report-Only, che usa la Reporting API del browser per dirti cosa la policy romperebbe senza romperlo davvero. Eseguire prima in report-only, tenere d'occhio i flussi di popup o di finestra che verrebbero colpiti, e solo dopo passare all'header imposto è la via sicura, soprattutto su un sito con integrazioni di terze parti che non hai costruito tu.
Cosa cambia sul tuo sito una volta attivato?
Per la maggior parte dei siti, nulla di visibile. I normali caricamenti di pagina, la navigazione e il comportamento same-origin non sono influenzati, e l'isolamento avviene in modo invisibile a livello di browser. Il vantaggio che ottieni è che le finestre cross-origin non possono più mantenere un riferimento verso la tua, il che rimuove la superficie di attacco senza toccare l'esperienza utente.
Il punto da controllare è qualsiasi flusso che apra deliberatamente un'altra origine o venga aperto da essa. Un fornitore di pagamenti, un identity provider, o uno strumento incorporato che comunica tramite riferimenti di finestra può essere colpito da un valore same-origin rigoroso, ed è proprio per questo che same-origin-allow-popups esiste e per cui il test in report-only conta. C'è anche un vantaggio che vale la pena conoscere: impostare same-origin, insieme all'header affine Cross-Origin-Embedder-Policy, porta il tuo documento in uno stato cross-origin isolated che alcune potenti funzionalità del browser richiedono, come SharedArrayBuffer e i timer ad alta risoluzione.
Cosa dovresti fare adesso?
Comincia col controllare se il tuo sito invia affatto un header Cross-Origin-Opener-Policy, perché l'assenza predefinita di header significa nessun isolamento. Se manca, la via a basso rischio è aggiungerlo in modalità report-only, confermare che nulla nei tuoi flussi di popup o di terze parti si rompa, e poi imporre same-origin-allow-popups come valore predefinito sensato, o same-origin se il tuo sito non ha dipendenze dai popup.
Se desideri che questo venga controllato e configurato correttamente su tutto il tuo sito anziché a pezzi, EuroraCloud può esaminare i tuoi security header attuali e mostrarti cosa risolve la nostra piattaforma. Scopri cosa risolve EuroraCloud
Conclusione: cosa dovresti portare con te sull'header Cross-Origin-Opener-Policy?
COOP è un header silenzioso ma prezioso: isola la tua finestra del browser dalle pagine cross-origin, chiudendo una classe di attacchi side-channel e tramite popup che non lasciano alcun segno visibile finché uno scanner o un aggressore non li trova. Per la maggior parte dei siti la via sicura è testare in modalità report-only, poi imporre same-origin-allow-popups, che protegge la finestra preservando i flussi popup legittimi. Il passo più utile è controllare se il tuo sito invia l'header oggi, perché finché non lo fa, il valore predefinito è nessun isolamento.