State Partitioning

State Partitioning ist eine umfassende Initiative von Mozilla, um die Verwaltung des clientseitigen Zustands in Firefox (d. h. Daten, die im Browser gespeichert sind) neu zu gestalten. Ziel ist es, die Fähigkeit von Websites einzuschränken, den Zustand für die verfolgung über Website-Grenzen hinweg zu missbrauchen, z. B. durch Third-Party-Cookies.

Diese Bemühung zielt darauf ab, jedem von einem Benutzer besuchten Website einen partitionierten Speicherort bereitzustellen. Dieser Artikel gibt einen Überblick über den Mechanismus, listet die betroffenen APIs auf und erklärt, wie betroffene Websites debuggt werden können.

Ab Firefox 103 ist State Partitioning standardmäßig aktiviert.

Motivation

Verfolgung über Websites hinweg unter Verwendung gemeinsamer Zustände

Browser ordnen traditionell den clientseitigen Zustand nach dem Ursprung (oder manchmal der registrierbaren Domäne) der URL, von der ein Ressourcenaufruf geladen wurde. Beispielsweise werden die Cookies, localStorage-Objekte und Caches, die in einem iframe geladen von https://example.com/hello.html verfügbar sind, von example.com aufgezeichnet. Dies gilt unabhängig davon, ob der Browser derzeit Ressourcen von dieser Domäne als First-Party-Ressource oder als eingebettete Third-Party-Ressource lädt. Verfolger haben diesen Zustand genutzt, um Benutzerkennungen zu speichern und auf sie über Websites hinweg zuzugreifen. Das folgende Beispiel zeigt, wie example.com seinen Zustand (in diesem Fall Cookies) verwenden kann, um einen Benutzer sowohl auf seiner eigenen Website als auch auf A.example und B.example zu verfolgen.

Ein Beispiel für einen Zustand über Websites hinweg

Frühere Ansätze zur Blockierung der Verfolgung über Websites hinweg

Die bisherigen Cookie-Richtlinien von Firefox versuchen, die Verfolgung zu mildern, indem der Zugriff auf einige Speicher-APIs (z. B. Cookies und localStorage) für bestimmte Domänen unter bestimmten Bedingungen blockiert wird. Zum Beispiel verhindert unsere "Alle Third-Party-Cookies blockieren"-Richtlinie, dass alle Domänen auf bestimmte Speicher-APIs zugreifen können, wenn sie in einem Drittparteikontext geladen werden. Unsere aktuelle Standard-Cookie-Richtlinie blockiert den Zugriff in einem Drittparteikontext nur für als Verfolger klassifizierte Domänen.

State Partitioning

State Partitioning ist ein anderer Ansatz zur Verhinderung der Verfolgung über Websites hinweg. Anstatt den Zugriff auf bestimmte zustandsbehaftete APIs im Drittparteikontext zu blockieren, bietet Firefox eingebetteten Ressourcen einen separaten Speicherbereich für jede oberste Website. Genauer gesagt, doppelschreibt Firefox den gesamten clientseitigen Zustand nach dem Ursprung der geladenen Ressource und der obersten Website. In den meisten Fällen ist die oberste Website das Schema und die eTLD+1 der von der Benutzerin oder dem Benutzer besuchten obersten Seite.

Im folgenden Beispiel ist example.com in A.example und B.example eingebettet. Da der Speicher partitioniert ist, gibt es jedoch drei verschiedene Speicherbereiche (anstatt einen). Der Verfolger kann weiterhin auf den Speicher zugreifen, aber da jeder Speicherbereich zusätzlich unter der obersten Website aufgezeichnet wird, sind die Daten, die auf A verfügbar sind, anders als die auf B. Dies wird verhindern, dass ein Verfolger einen Bezeichner in seinen Cookies speichert, wenn er direkt besucht wird, und dann diesen Bezeichner abruft, wenn er auf anderen Websites eingebettet ist.

Ein Beispiel für State Partitioning

Standardisierung

Die Privacy Community Group hat ein Arbeitselement für die Client-Side Storage Partitioning. Dies bietet einen Überblick über die Standardisierungsbemühungen für die Partitionierung von Speicher in den einzelnen betroffenen Standards. Wir beabsichtigen, unsere Implementierung der Zustandspartitionierung mit diesen Bemühungen in Einklang zu bringen, sobald das Arbeitselement standardisiert ist.

Status der Partitionierung in Firefox

Statische Partitionierung

Speicherpartitionierung

Um die Verwendung von JavaScript-erschwinglichen Speicher-APIs für die Verfolgung über Website-Grenzen hinweg zu verhindern, wird der zugängliche Speicher nach der obersten Website partitioniert. Dieser Mechanismus bedeutet, dass im Allgemeinen ein Dritter, der in einer obersten Website eingebettet ist, nicht auf unter einer anderen obersten Website gespeicherte Daten zugreifen kann.

Speicher-APIs

Netzwerkpartitionierung

Netzwerkbezogene APIs sind nicht dazu bestimmt, von Websites für die Datenspeicherung genutzt zu werden, können aber missbraucht werden, um Verfolgung über Websites hinweg durchzuführen. Aus diesem Grund sind die folgenden Netzwerk-APIs und Caches permanent nach der obersten Website partitioniert.

Hinweis: Die Netzwerkpartitionierung ist dauerhaft. Websites können diese Einschränkungen weder kontrollieren noch lockern.

Netzwerk-APIs

  • HTTP Cache
  • Bild-Cache
  • Favicon-Cache
  • Verbindungs-Pooling
  • Stylesheet-Cache
  • DNS
  • HTTP-Authentifizierung
  • Alt-Svc
  • Spekulative Verbindungen
  • Schriften & Schrift-Cache
  • HSTS
  • OCSP
  • Intermediate CA Cache
  • TLS-Client-Zertifikate
  • TLS-Sitzungs-IDs
  • Prefetch
  • Preconnect
  • CORS-preflight Cache
  • WebRTC deviceID

Dynamische Partitionierung

Allgemein gilt, wenn zugänglicher Speicher nach der obersten Website partitioniert ist, kann dennoch Zugriff auf die unpartitionierten Cookies eines Dritten gewährt werden, wenn die Storage Access API unterstützt wird:

  • unter Verwendung der Storage Access API.
  • automatisch, wie etwa für Dritte, die föderiertes Login bereitstellen.

Details zu automatischen Genehmigungen finden Sie im Abschnitt Heuristiken für den Speicherzugang.

Dynamisch partitionierte APIs

Heuristiken für den Speicherzugang

Um die Webkompatibilität zu verbessern, enthält Firefox derzeit einige Heuristiken, um unpartitionierten Zugriff auf Cookies automatisch an Dritte zu gewähren, die Benutzerinteraktionen erhalten. Diese Heuristiken sollen es einigen auf dem Web verbreiteten Dritte-Integration erlauben, weiterhin zu funktionieren.

Warnung: Heuristiken für den Speicherzugang sind ein Übergangsmerkmal, das dazu gedacht ist, das Brechen von Websites zu verhindern. Sie sollten nicht für aktuelle und zukünftige Webentwicklungen verwendet werden.

Heuristiken für Fenster, die mit dem öffnenden Fenster verbunden sind

  • Wenn ein partitionierter Drittanbieter ein Pop-up-Fenster öffnet, das Zugriff auf den öffnenden Dokumenten hat, wird diesem Dritten für 30 Tage Speicherzugriff auf seinen Einbettungskontext gewährt.
  • Wenn eine First-Party a.example ein Drittparteien-Pop-up b.example öffnet, wird b.example für 30 Tage Drittparteien-Speicherzugang zu a.example gewährt.

Hinweis: Für Dritte, die diese Heuristik für Verfolgungszwecke missbrauchen, können wir verlangen, dass Benutzer mit dem Pop-up interagieren, bevor Speicherzugang gewährt wird.

Redirect-Heuristiken

  • Wenn eine Website b.example zu a.example umleitet, erhält b.example Speicherzugang zu seinem Einbettungskontext a.example, wenn sowohl a.example als auch b.example innerhalb der letzten 10 Minuten besucht und interagiert wurden. Dieser Speicherzugang wird für 15 Minuten gewährt.
  • Wenn ein Verfolger tracker.example (wie von der erweiterten Verfolgungsschutzfunktion klassifiziert) zu einer nicht verfolgenden a.example umleitet und tracker.example in den letzten 45 Tagen als First-Party eine Benutzerinteraktion erhalten hat, wird tracker.example für 15 Minuten Speicherzugang zu a.example gewährt.

Storage Access API

Drittanbieterrahmen können die document.requestStorageAccess verwenden, um durch die Storage Access API unbegrenzten Zugang zu Cookies anzufordern. Nachdem dies genehmigt wurde, erhält die anfragende Partei Zugang zu ihren gesamten First-Party-Cookies (d. h. den Cookies, auf die sie zugreifen hätte, wenn sie als First-Party besucht wäre).

Warnung: Wenn Speicherzugriff gewährt wird, können immer noch Verweise auf den partitionierten Speicher vorhanden sein. Websites sollten sich jedoch nicht darauf verlassen können, partitionierte und unpartitionierte Cookies gleichzeitig verwenden zu können.

Debugging

Wir ermutigen Website-Besitzer, ihre Sites zu testen, insbesondere jene, die auf Inhaltsintegration von Drittanbietern angewiesen sind. Es gibt mehrere Funktionen in Firefox, die das Testen erleichtern.

Logging

Hier ist eine Übersicht der Nachrichten, die in der Webkonsole protokolliert werden, wenn mit Speicher in einem Drittparteikontext interagiert wird. In den folgenden Beispielen ist a.example die oberste Website, die den Drittanbieterrahmen b.example einbettet.

Grund Konsolennachricht
Der Speicher eines Drittanbieterrahmens ist partitioniert Partitionierter Cookie- oder Speicherzugriff wurde "b.example" bereitgestellt, da es im Drittparteikontext geladen wird und Speicherpartitionierung aktiviert ist.
Zugriff auf nicht partitionierte Cookies durch Heuristiken für den Speicherzugang gewährt Speicherzugriff automatisch für First-Party-Isolation "b.example" auf "a.example" gewährt.
Zugriff auf nicht partitionierte Cookies über die StorageAccessAPI gewährt Speicherzugriff für Ursprung "b.example" auf "a.example" gewährt.

Drittenparties Speicherzugang löschen

Wenn ein Drittanbieter-iframe Speicherzugriff auf den übergeordneten Kontext gewährt wird, setzt Firefox eine Erlaubnis. Um den Zugriff zu widerrufen, können Sie die Erlaubnis über das Site-Informationsfenster im Bereich "Berechtigungen" unter "Website-übergreifende Cookies" löschen.

Testeinstellungen

Warnung: Stellen Sie sicher, diese Einstellungen in einem separaten Firefox-Profil vorzunehmen oder sie nach dem Testen zurückzusetzen.

Deaktivieren von Webkompatibilitäts-Features

Die Einstellung privacy.antitracking.enableWebcompat auf false wird alle ETP- und State Partitioning-Webkompatibilitätsfunktionen deaktivieren. Das Deaktivieren dieser Funktionen kann beim Testen nützlich sein, um sicherzustellen, dass Ihre Website vollständig mit dem State Partitioning-Mechanismus in Firefox kompatibel ist und nicht auf temporäre Heuristiken angewiesen ist.

Funktionen, die durch die Voreinstellung deaktiviert werden, umfassen:

Heuristiken deaktivieren

Mit den folgenden Voreinstellungen können einzelne Heuristiken für den Speicherzugang über den Konfiguration Editor deaktiviert werden:

  • Aktivieren / Deaktivieren der Redirect-Heuristiken: privacy.restrict3rdpartystorage.heuristic.recently_visited, privacy.restrict3rdpartystorage.heuristic.redirect
  • Aktivieren / Deaktivieren der Fenster öffnen Heuristiken: privacy.restrict3rdpartystorage.heuristic.window_open, privacy.restrict3rdpartystorage.heuristic.opened_window_after_interaction

Netzwerkpartitionierung deaktivieren

Die Netzwerkpartitionierung kann mit der Voreinstellung privacy.partition.network_state deaktiviert werden.

Dynamische Zustandspartitionierung deaktivieren

Um die dynamische Speicherpartitionierung für alle Websites zu deaktivieren, können Sie die Voreinstellung network.cookie.cookieBehavior verwenden:

Wert Beschreibung
5 Verweigern (bekannter) Verfolger und Partitionierung von Drittanbieterspeicher.
4 Nur Verfolger ablehnen (Speicherpartitionierung deaktiviert).
0 Alles erlauben

Bestimmte Ursprünge von der Partitionierung ausnehmen

Die dynamische Zustandspartitionierung kann auch für bestimmte Ursprünge mit der privacy.restrict3rdpartystorage.skip_list Voreinstellung deaktiviert werden. Diese Voreinstellung enthält eine durch Kommas getrennte Liste der Zwecke, die ausgenommen werden sollen. Der Wert sollte dem folgenden Format folgen: first-party_origin_1,third-party_origin_1;first-party_origin_2,third-party_origin_2;....

Um zum Beispiel die Partitionierung für tracker.example auf example.com oder social.example auf news.example zu deaktivieren, würden Sie die Voreinstellung auf den folgenden Wert setzen:

https://example.com,https://tracker.example;https://news.example,https://social.example

Sie können * als Platzhalter für entweder die erste oder dritte Partei verwenden. Um zum Beispiel die Partitionierung für videos.example auf allen Seiten zu deaktivieren oder um die gesamte Partitionierung auf unpartitioned.example zu deaktivieren, würden Sie die Voreinstellung auf den folgenden Wert setzen:

*,https://videos.example;unpartitioned.example,*