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 hochauflösenden Timer genauer zu nutzen.

Eiji Kitamura
Eiji Kitamura
Domenic Denicola
Domenic Denicola

Einführung

Lesen Sie in der Anleitung Website ursprungsübergreifend isoliert machen“. mit COOP und COEP haben wir erklärt, wie die ursprungsübergreifende isoliert" mithilfe von COOP und COEP. In diesem Begleitartikel wird erklärt, warum die ursprungsübergreifende Isolierung erforderlich ist, um leistungsstarke Funktionen im Browser zu aktivieren.

Hintergrund

Das Web basiert auf Same-Origin- : Eine Sicherheitsfunktion, die wie Dokumente und Skripts mit Ressourcen anderer Herkunft interagieren können. Dieses schränkt die Möglichkeiten ein, wie Websites auf ursprungsübergreifende Ressourcen zugreifen können. Für Beispiel: Ein Dokument von „https://a.example“ kann nicht auf Daten zugreifen gehostet bei https://b.example.

Für dieselbe Richtlinie für denselben Ursprung gab es jedoch in der Vergangenheit einige Ausnahmen. Jede Website kann:

  • Ursprungsübergreifende iFrames einbetten
  • Ursprungsübergreifende Ressourcen wie Bilder oder Skripts einschließen
  • Ursprungsübergreifende Pop-up-Fenster mit einer DOM-Referenz öffnen

Könnte das Web von Grund auf neu gestaltet werden, gäbe es diese Ausnahmen nicht. Als die Web-Community die wichtigsten Vorteile eines strengen Same-Origin-Policy, hat sich das Web bereits auf diese Ausnahmen gestützt.

Die sicherheitsrelevanten Nebeneffekte einer solchen laxen Same-Origin-Policy wurden in zwei . Eine Möglichkeit war die Einführung eines neuen Protokolls namens Cross- Origin Resource Sharing (CORS) der dafür sorgt, dass der Server die Freigabe einer Ressource für einen mit einem bestimmten Ursprung. Oder Sie entfernen den direkten Skriptzugriff ursprungsübergreifenden Ressourcen unter Beibehaltung der Abwärtskompatibilität. Ein solches ursprungsübergreifende Ressourcen werden als „opaque“ bezeichnet. Ressourcen. Aus diesem Grund Pixel eines ursprungsübergreifenden Bildes mithilfe von CanvasRenderingContext2D manipulieren schlägt fehl, sofern nicht CORS auf das Image angewendet wird.

Alle diese Richtlinienentscheidungen werden innerhalb einer Browserkontextgruppe getroffen.

Kontextgruppe durchsuchen

Lange Zeit reichte die Kombination aus CORS und undurchsichtigen Ressourcen aus, Browser sicher sind. Manchmal können Grenzfälle (wie JSON Sicherheitslücken) gefunden wurden und gepatcht werden mussten. direkten Lesezugriff auf die Rohbyte von ursprungsübergreifenden Ressourcen erfolgreich war.

All dies hat sich geändert mit Spectre, alle Daten, die in dieselbe Browserkontextgruppe geladen werden wie Ihr Code, lesbar sein. Durch die Messung der Zeit, die bestimmte Abläufe in Anspruch nehmen, können Angreifer den Inhalt der CPU-Cache-Speicher erraten kann. Prozess zu speichern. Solche Timing-Angriffe sind mit Timern mit niedriger Granularität möglich die bereits auf der Plattform vorhanden sind, aber mit Timern mit hoher Detailgenauigkeit, sowohl explizit (wie performance.now()) als auch implizit (wie SharedArrayBuffer). Wenn evil.com ein ursprungsübergreifendes Bild einbettet, kann ein Spectre-Angriff zum Lesen seiner Pixeldaten. "Undurchsichtigkeit" unwirksam sein.

Spektr.

Idealerweise sollten alle ursprungsübergreifenden Anfragen explizit vom Server überprüft werden. dem die Ressource gehört. Wird keine Überprüfung durch auf dem ressourceneigenen Server, kommen die Daten niemals auf dem Kontextgruppe eines bösen Schauspielers und bleibt deshalb außerhalb der Reichweite die eine Webseite ausführen könnte. Wir nennen das einen ursprungsübergreifend isolierten Zustand. Genau darum geht es bei COOP+COEP.

In einem ursprungsübergreifend isolierten Zustand gilt die anfragende Website als weniger und dadurch leistungsstarke Funktionen wie SharedArrayBuffer, performance.measureUserAgentSpecificMemory() und hohe Auflösung können Sie sogar Timern genauer angeben, für spektreähnliche Angriffe verwendet werden. Außerdem wird verhindert, dass Änderungen document.domain

Cross-Origin-Embedder-Richtlinie

Cross-Origin-Embedder Richtlinie (COEP) verhindert, dass ein das Laden ursprungsübergreifender Ressourcen, die nicht explizit Dokumentberechtigung (mit CORP oder CORS) Mit dieser Funktion können Sie dass ein Dokument solche Ressourcen nicht laden kann.

Funktionsweise von COEP

Hängen Sie zum Aktivieren dieser Richtlinie den folgenden HTTP-Header an das Dokument an:

Cross-Origin-Embedder-Policy: require-corp

Das Keyword require-corp ist der einzige zulässige Wert für COEP. Dies erzwingt Die Richtlinie, dass das Dokument nur Ressourcen aus demselben Ursprung laden kann, oder Ressourcen, die explizit als aus einem anderen Ursprung ladebar 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) verwenden.

Cross-Origin Resource Sharing

Wenn eine ursprungsübergreifende Ressource Cross-Origin Resource Sharing unterstützt (CORS) verwenden, können Sie das crossorigin Attribut um sie auf Ihre Webseite zu laden, ohne von COEP blockiert zu werden.

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

Wenn diese Bildressource beispielsweise mit CORS-Headern bereitgestellt wird, verwenden Sie die Methode crossorigin-Attribut, damit die Anfrage zum Abrufen der Ressource CORS verwendet. Modus an. Dies gilt auch für verhindert, dass das Bild geladen wird, es sei denn, es werden CORS-Header festgelegt.

In ähnlicher Weise können Sie ursprungsübergreifende Daten über die Methode fetch() abrufen, die erfordert keine besondere Behandlung, solange der Server mit der richtigen Antwort HTTP Header.

Cross-Origin-Ressourcenrichtlinie

Cross-Origin-Ressourcenrichtlinie (CORP) wurde ursprünglich als Opt-in eingeführt, um Ihre Ressourcen vor von einem anderen Ursprung geladen werden. Im Kontext von COEP kann CORP die Ressource angeben. Inhaberrichtlinie für das Laden von Ressourcen.

Der Header Cross-Origin-Resource-Policy hat drei mögliche Werte:

Cross-Origin-Resource-Policy: same-site

Mit same-site gekennzeichnete Ressourcen können nur von derselben Website geladen werden.

Cross-Origin-Resource-Policy: same-origin

Ressourcen, die als same-origin gekennzeichnet sind, können nur aus demselben Ursprung geladen werden.

Cross-Origin-Resource-Policy: cross-origin

Mit cross-origin gekennzeichnete Ressourcen können von jeder beliebigen Website geladen werden. (Diese Wert hinzugefügt wurde. CORP-Spezifikation zusammen mit COEP.)

Cross-Origin-Opener-Richtlinie

Cross-Origin-Opener-Richtlinie (COOP) können Sie sicherstellen, dass ein Fenster der obersten Ebene von anderen Dokumenten isoliert wird, indem sie in einem Gruppen unterschiedlicher Browserkontexte, sodass sie nicht direkt mit dem oberste Ebene. Wenn beispielsweise ein Dokument mit COOP ein Popup-Fenster öffnet, werden seine Die Property „window.opener“ wird dann „null“. Außerdem ist das Attribut .closed der für den Opener-Verweis darauf true zurück.

COOP

Der Header Cross-Origin-Opener-Policy hat drei mögliche Werte:

Cross-Origin-Opener-Policy: same-origin

Dokumente, die als same-origin markiert sind, können denselben Browserkontext verwenden. Gruppe mit Dokumenten mit demselben Ursprung, die ebenfalls explizit als same-origin gekennzeichnet sind.

COOP

Cross-Origin-Opener-Policy: same-origin-allow-popups

Ein Dokument der obersten Ebene mit same-origin-allow-popups behält Verweise auf alle seiner Pop-ups, die entweder COOP nicht festlegen oder die Isolation durch COOP von unsafe-none wird festgelegt.

COOP

Cross-Origin-Opener-Policy: unsafe-none

unsafe-none ist die Standardeinstellung und ermöglicht, dass das Dokument zum Öffnende hinzugefügt werden kann. Browser-Kontextgruppe, es sei denn, das Öffnende selbst hat den COOP-Wert same-origin.

Zusammenfassung

Wenn Sie garantierten Zugriff auf leistungsstarke Funktionen wie SharedArrayBuffer wünschen, performance.measureUserAgentSpecificMemory() oder hohe Auflösung Timer genauer einstellen, denken Sie einfach daran, dass Ihr Dokument sowohl COEP mit dem Wert require-corp als auch COOP mit dem Wert same-origin. Fehlt diese, wird der Browser keine ausreichende Isolation garantiert, um diese leistungsstarken Funktionen sicher zu aktivieren. Ich um die Situation Ihrer Seite zu ermitteln, self.crossOriginIsolated gibt true zurück.

Die Schritte zur Implementierung dieser Funktion finden Sie unter Ihre Website ursprungsübergreifend gestalten. isoliert" COOP und COEP

Ressourcen