Hier erfahren Sie, warum die ursprungsübergreifende Isolierung erforderlich ist, um leistungsstarke Funktionen wie SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
und einen Timer mit hoher Auflösung mit höherer Präzision zu verwenden.
Einführung
Im Hilfeartikel Websites mit COOP und COEP plattformübergreifend isolieren haben wir beschrieben, wie Sie mit COOP und COEP den Status „plattformübergreifend isoliert“ erreichen. In diesem Artikel wird erläutert, warum eine ursprungsübergreifende Isolierung erforderlich ist, um leistungsstarke Funktionen im Browser zu ermöglichen.
Hintergrund
Das Web basiert auf der Richtlinie für denselben Ursprung: einer Sicherheitsfunktion, die einschränkt, wie Dokumente und Scripts mit Ressourcen aus einer anderen Quelle interagieren können. Dieses Prinzip schränkt die Möglichkeiten ein, wie Websites auf plattformübergreifende Ressourcen zugreifen können. Beispiel: Ein Dokument von https://a.example
kann nicht auf Daten zugreifen, die bei https://b.example
gehostet werden.
Es gab jedoch einige Ausnahmen von der Richtlinie für denselben Ursprung. Jede Website kann:
- Ursprungsübergreifende iFrames einbetten
- Ressourcen mit unterschiedlichen Ursprüngen wie Bilder oder Scripts einbinden
- Pop-up-Fenster mit DOM-Referenz öffnen
Wenn das Web von Grund auf neu gestaltet werden könnte, gäbe es diese Ausnahmen nicht. Leider wurde die Web-Community erst spät auf die Vorteile einer strikten Richtlinie für denselben Ursprung aufmerksam. Zu diesem Zeitpunkt waren diese Ausnahmen bereits im Web etabliert.
Die Sicherheitsrisiken einer solchen laschen Richtlinie für denselben Ursprung wurden auf zwei Arten behoben. Eine Möglichkeit bestand in der Einführung eines neuen Protokolls namens Cross-Origin Resource Sharing (CORS), das dafür sorgt, dass der Server die Freigabe einer Ressource mit einem bestimmten Ursprung zulässt. Die andere Möglichkeit besteht darin, den direkten Scriptzugriff auf ressourcen zwischen verschiedenen Ursprüngen implizit zu entfernen und gleichzeitig die Abwärtskompatibilität beizubehalten. Solche plattformübergreifenden Ressourcen werden als „undurchsichtige“ Ressourcen bezeichnet. Aus diesem Grund ist es beispielsweise nicht möglich, die Pixel eines plattformübergreifenden Bildes über CanvasRenderingContext2D
zu manipulieren, es sei denn, CORS wird auf das Bild angewendet.
Alle diese Richtlinienentscheidungen werden innerhalb einer Browserkontextgruppe getroffen.
Lange Zeit reichte die Kombination aus CORS und opaken Ressourcen aus, um Browser sicher zu machen. Gelegentlich wurden Grenzfälle (z. B. JSON-Sicherheitslücken) entdeckt und mussten gepatcht werden. Insgesamt war das Prinzip, keinen direkten Lesezugriff auf die Rohbytes von plattformübergreifenden Ressourcen zuzulassen, jedoch erfolgreich.
Das hat sich mit Spectre geändert. Dadurch können alle Daten, die in dieselbe Browserkontextgruppe wie Ihr Code geladen werden, potenziell gelesen werden. Durch das Messen der Zeit, die bestimmte Vorgänge in Anspruch nehmen, können Angreifer den Inhalt der CPU-Caches und damit den Inhalt des Arbeitsspeichers des Prozesses erraten. Solche Timing-Angriffe sind mit Timern mit geringer Granularität möglich, die auf der Plattform vorhanden sind, können aber mit Timern mit hoher Granularität beschleunigt werden, sowohl explizit (wie performance.now()
) als auch implizit (wie SharedArrayBuffer
s). Wenn evil.com
ein plattformübergreifendes Bild einbettet, kann er mit einem Spectre-Angriff die Pixeldaten lesen. Dadurch werden Schutzmaßnahmen, die auf „Undurchsichtigkeit“ beruhen, unwirksam.
Im Idealfall sollten alle plattformübergreifenden Anfragen vom Server, zu dem die Ressource gehört, explizit geprüft werden. Wenn die Prüfung nicht vom Server mit der Ressource durchgeführt wird, gelangen die Daten nie in die Browserkontextgruppe eines böswilligen Akteurs und sind daher nicht von Spectre-Angriffen betroffen, die über eine Webseite ausgeführt werden könnten. Wir nennen ihn ursprungsübergreifend isolierter Status. Genau darum geht es bei COOP+COEP.
Bei einem plattformübergreifenden isolierten Zustand wird die anfragende Website als weniger gefährlich eingestuft. Dadurch können leistungsstarke Funktionen wie SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
und Timer mit hoher Auflösung mit höherer Präzision genutzt werden, die andernfalls für Spectre-ähnliche Angriffe verwendet werden könnten. Außerdem wird verhindert, dass document.domain
geändert wird.
Cross-Origin-Embedder-Richtlinie
Die Cross Origin Embedder Policy (COEP) verhindert, dass in einem Dokument Ressourcen unterschiedlicher Herkunft geladen werden, die nicht explizit die Berechtigung für das Dokument gewähren (mit CORP oder CORS). Mit dieser Funktion können Sie angeben, dass für ein Dokument keine solchen Ressourcen geladen werden dürfen.
Fügen Sie dem Dokument den folgenden HTTP-Header hinzu, um diese Richtlinie zu aktivieren:
Cross-Origin-Embedder-Policy: require-corp
COEP nimmt einen einzelnen Wert von require-corp
an. Dadurch wird die Richtlinie erzwungen, dass das Dokument nur Ressourcen aus demselben Ursprung oder Ressourcen laden kann, die ausdrücklich als über einen anderen Ursprung ladbar gekennzeichnet sind.
Damit Ressourcen von einem anderen Ursprung geladen werden können, müssen sie entweder Cross-Origin Resource Sharing (CORS) oder Cross-Origin Resource Policy (CORP) unterstützen.
Cross-Origin Resource Sharing
Wenn eine ressourcenübergreifende Ressource Cross-Origin Resource Sharing (CORS) unterstützt, können Sie das crossorigin
-Attribut verwenden, um sie auf Ihrer Webseite zu laden, ohne dass sie von COEP blockiert wird.
<img src="https://third-party.example.com/image.jpg" crossorigin>
Wenn diese Bildressource beispielsweise mit CORS-Headern bereitgestellt wird, verwenden Sie das Attribut crossorigin
, damit die Anfrage zum Abrufen der Ressource den CORS-Modus verwendet. Außerdem wird verhindert, dass das Bild geladen wird, es sei denn, CORS-Header werden festgelegt.
Ebenso können Sie datenübergreifend über die fetch()
-Methode abrufen. Diese erfordert keine spezielle Verarbeitung, solange der Server mit den richtigen HTTP-Headers antwortet.
Richtlinie für Cross-Origin-Ressourcen
Die Cross-Origin Resource Policy (CORP) wurde ursprünglich als Opt-in eingeführt, um Ihre Ressourcen vor dem Laden durch eine andere Quelle zu schützen. Im Rahmen von COEP kann CORP die Richtlinie des Ressourceneigentümers angeben, wer eine Ressource laden darf.
Der Cross-Origin-Resource-Policy
-Header kann drei Werte haben:
Cross-Origin-Resource-Policy: same-site
Ressourcen, die mit same-site
gekennzeichnet sind, können nur von derselben Website geladen werden.
Cross-Origin-Resource-Policy: same-origin
Ressourcen, die mit same-origin
gekennzeichnet sind, können nur von derselben Quelle geladen werden.
Cross-Origin-Resource-Policy: cross-origin
Ressourcen, die mit cross-origin
gekennzeichnet sind, können von jeder Website geladen werden. Dieser Wert wurde der CORP-Spezifikation zusammen mit COEP hinzugefügt.
Cross-Origin-Opener-Richtlinie
Mit der Cross Origin Opener Policy (COOP) können Sie dafür sorgen, dass ein Fenster der obersten Ebene von anderen Dokumenten isoliert ist. Dazu werden sie in eine andere Gruppe von Browserkontexten verschoben, sodass sie nicht direkt mit dem Fenster der obersten Ebene interagieren können. Wenn ein Dokument mit COOP beispielsweise ein Pop-up öffnet, ist der Wert der window.opener
-Property null
. Außerdem wird für die .closed
-Property der Verweis des Öffners darauf true
zurückgegeben.
Der Cross-Origin-Opener-Policy
-Header kann drei Werte haben:
Cross-Origin-Opener-Policy: same-origin
Dokumente, die mit same-origin
gekennzeichnet sind, können dieselbe Browserkontextgruppe wie Dokumente mit demselben Ursprung haben, die ebenfalls explizit mit same-origin
gekennzeichnet sind.
Cross-Origin-Opener-Policy: same-origin-allow-popups
In einem Dokument auf oberster Ebene mit same-origin-allow-popups
werden Verweise auf alle Pop-ups beibehalten, für die entweder keine COOP festgelegt wurde oder die die Isolation deaktivieren, indem sie eine COOP von unsafe-none
festlegen.
Cross-Origin-Opener-Policy: unsafe-none
unsafe-none
ist der Standardwert und ermöglicht es, das Dokument der Browserkontextgruppe des Öffners hinzuzufügen, es sei denn, der Öffner selbst hat eine COOP von same-origin
.
Zusammenfassung
Wenn Sie mit höherer Präzision auf leistungsstarke Funktionen wie SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
oder Timer mit hoher Auflösung zugreifen möchten, muss in Ihrem Dokument sowohl COEP mit dem Wert require-corp
als auch COOP mit dem Wert same-origin
verwendet werden. Andernfalls kann der Browser nicht für eine ausreichende Isolation sorgen, um diese leistungsstarken Funktionen sicher zu aktivieren. Sie können den Status Ihrer Seite prüfen, indem Sie prüfen, ob self.crossOriginIsolated
true
zurückgibt.
Weitere Informationen zur Implementierung finden Sie unter Websites mit COOP und COEP plattformübergreifend isolieren.