Security Header

COOP, COEP und CORP im Detail: Cross-Origin Isolation

Die HTTP-Header COOP (Cross-Origin-Opener-Policy), COEP (Cross-Origin-Embedder-Policy) und CORP (Cross-Origin-Resource-Policy) bilden eine moderne Sicherheits-Triade. Sie wurden entwickelt, um Webanwendungen vor CPU-Side-Channel-Angriffen wie Spectre zu schützen. Zusammen ermöglichen sie die sogenannte Cross-Origin Isolation, einen Zustand, in dem der Browser eine Website in einem komplett isolierten Betriebssystem-Prozess ausführt.

Diese drei Header gehören zu den fortgeschrittenen Einträgen jeder Security-Header-Checkliste und ergänzen klassische Schutzmassnahmen wie die Content-Security-Policy und X-Frame-Options auf der Prozessebene des Browsers.

Das Bedrohungsszenario: Spectre und Shared Memory

Im Jahr 2018 deckten Sicherheitsforscher gravierende Designfehler in modernen Prozessoren (CPUs) auf: Spectre.

  • Spectre erlaubt es einem Prozess, über Zeitmessungs-Abweichungen (Timing Attacks) Bereiche des Arbeitsspeichers (RAM) auszulesen, die eigentlich für andere Prozesse gesperrt sind.
  • Da Webbrowser historisch oft mehrere offene Tabs oder Ressourcen unterschiedlicher Herkunft (Origins) im selben Betriebssystem-Prozess ausführten, konnte ein Angreifer über ein einfaches Skript sensible Speicherbereiche anderer Tabs auslesen.
  • Die Reaktion der Browser-Hersteller: Um die Angriffe zu erschweren, wurden hochauflösende Zeitmessungen im Browser deaktiviert und mächtige APIs wie SharedArrayBuffer (wichtig für WebAssembly-Multi-Threading) standardmässig blockiert.

Die Lösung: Cross-Origin Isolation über HTTP-Header

Um diese leistungsstarken APIs wieder sicher nutzen zu können, müssen Server dem Browser signalisieren, dass die Seite vollkommen isoliert vom restlichen Web ausgeführt werden soll. Hierzu werden drei Header kombiniert:

1. COOP (Cross-Origin-Opener-Policy)

Verhindert, dass fremde Webseiten, die Ihre Seite über JavaScript (z. B. window.open) öffnen, Zugriff auf das Window-Objekt Ihrer Seite haben (und umgekehrt).

  • Konfiguration: Cross-Origin-Opener-Policy: same-origin
  • Der Browser trennt das geöffnete Fenster sofort in einen separaten Prozess.

2. COEP (Cross-Origin-Embedder-Policy)

Verhindert, dass Ihre Website Ressourcen (wie Bilder, Skripte, Styles) von externen Domains lädt, die nicht explizit der Einbettung zugestimmt haben.

  • Konfiguration: Cross-Origin-Embedder-Policy: require-corp

3. CORP (Cross-Origin-Resource-Policy)

Dieser Header wird von der Ressource (z. B. dem Bild auf einem CDN-Server) ausgesendet. Er teilt dem Browser mit, wer dieses Asset laden darf.

  • Konfiguration: Cross-Origin-Resource-Policy: same-origin (Nur die eigene Seite darf das Asset laden) Cross-Origin-Resource-Policy: cross-origin (Jede Seite darf das Asset laden – wichtig für öffentliche CDNs, damit sie mit COEP-Seiten kompatibel sind).

Die drei Header im Vergleich

Obwohl die Header zusammenarbeiten, haben sie unterschiedliche Aufgaben und werden von unterschiedlichen Parteien gesetzt:

HeaderGesetzt vonSchützt vorTypischer Wert
COOPeigener ServerZugriff öffnender Fenstersame-origin
COEPeigener Serverunkontrolliertem Einbettenrequire-corp
CORPRessourcen-ServerHotlinking/Einbettungsame-origin / cross-origin

Typische Fehlkonfigurationen

FehlerFolgeKorrektur
COEP ohne CORP auf Assetsexterne Bilder/Skripte blockiertCORP auf Ressourcen ergänzen
COOP unsafe-none belassenkeine Prozess-Isolationsame-origin setzen
Isolation ohne Bedarf erzwingenDrittanbieter-Widgets brechennur bei Bedarf aktivieren

Zusammenfassung für Entwickler

Für normale Informationsseiten ist die Konfiguration dieses Trios meist nicht zwingend erforderlich, da sie keine hochauflösenden Timer oder Shared Memory benötigen. Betreiben Sie jedoch komplexe WebAssembly-Anwendungen, interaktive Spiele oder Video-Editoren im Browser, führt an der Aktivierung von COOP und COEP kein Weg vorbei.

Aktivierung der Cross-Origin Isolation:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp

Beispiel: schrittweise Einführung

Aktivieren Sie zuerst nur COOP und beobachten Sie das Verhalten. Ergänzen Sie anschliessend COEP im Report-Only-Modus, um blockierte Ressourcen zu identifizieren, bevor Sie scharf schalten:

Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy-Report-Only: require-corp; report-to="coep"

So erkennen Sie alle Drittanbieter-Ressourcen ohne CORP-Header, bevor sie für echte Nutzer blockiert werden – ein Vorgehen analog zur stufenweisen Einführung anderer Security-Header.

[!TIP] Die korrekte Konfiguration von COOP und COEP erfordert, dass alle externen Skripte und Bilder den passenden CORP-Header mitsenden, da sie sonst blockiert werden. Prüfen Sie die Cross-Origin-Isolation Ihrer Website mit dem Security Header Check auf balou.tools.

Häufig gestellte Fragen (FAQ)

Was hat CPU-Spectre mit Webbrowsern zu tun?

Spectre ist ein Hardware-Sicherheitsfehler in modernen CPUs, der es ermöglicht, Daten aus dem Arbeitsspeicher anderer Prozesse auszulesen. Im Browser könnte ein bösartiges JavaScript im Hintergrund sensible Daten (z. B. Login-Token) einer im anderen Tab geöffneten Website ausspähen.

Was ist die Voraussetzung für die Nutzung von SharedArrayBuffer?

Um SharedArrayBuffer oder hochauflösende Timer (`performance.now()`) im Browser nutzen zu können, müssen Webserver zwingend COOP und COEP konfigurieren, um die Website in einen isolierten Betriebssystem-Prozess (Cross-Origin Isolation) zu versetzen.

Wie prüfe ich, ob meine Seite cross-origin-isoliert ist?

In den meisten Browsern lässt sich der Status über die JavaScript-Eigenschaft `window.crossOriginIsolated` abfragen. Gibt sie `true` zurück, sind COOP und COEP korrekt gesetzt und APIs wie `SharedArrayBuffer` stehen zur Verfügung. In den Entwicklertools zeigt der Reiter „Application“ bzw. „Security“ den Isolationszustand zusätzlich an.

Warum werden nach Aktivierung von COEP plötzlich Bilder blockiert?

Weil `require-corp` verlangt, dass jede eingebettete Cross-Origin-Ressource explizit per `Cross-Origin-Resource-Policy: cross-origin` zustimmt. Externe Bilder, Schriften oder Skripte ohne diesen Header werden vom Browser blockiert. Die Lösung: den CORP-Header auf den Ressourcen ergänzen oder die Inhalte selbst hosten.