Warum Sie für leistungsstarke Funktionen eine ursprungsübergreifende Isolierung benötigen

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 wurden diese Ausnahmen bereits verwendet, als die Web-Community die wichtigsten Vorteile einer strikten Richtlinie zum gleichen Ursprung erkannte.

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.

Gruppe „Browserkontext“

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 SharedArrayBuffers). 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.

Spectr

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.

In 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-Richtlinie (COEP) verhindert, dass in einem Dokument Ressourcen unterschiedlicher Herkunft geladen werden, die nicht explizit die Dokumentberechtigung gewähren (mit CORP oder CORS). Mit dieser Funktion können Sie angeben, dass in einem Dokument keine solchen Ressourcen geladen werden dürfen.

Funktionsweise von COEP

Fügen Sie dem Dokument den folgenden HTTP-Header hinzu, um diese Richtlinie zu aktivieren:

Cross-Origin-Embedder-Policy: require-corp

Das Keyword require-corp ist der einzige zulässige Wert für COEP. 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, hat die window.opener-Property den Wert null. Außerdem wird für die .closed-Property der Verweis des Öffners darauf true zurückgegeben.

COOP

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.

COOP

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, die entweder keine COOP festlegen oder die Isolation deaktivieren, indem sie eine COOP von unsafe-none festlegen.

COOP

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.

Ressourcen