Partycjonowanie pamięci masowej

Aby zapobiec niektórym typom śledzenia między witrynami, Chrome partycjonuje większość interfejsów API pamięci i komunikacji w kontekstach zewnętrznych.

Stan wdrożenia

Ta funkcja została włączona dla wszystkich użytkowników Chrome w wersji 115 lub nowszej. Proponowane partycjonowanie pamięci jest dostępne do dalszej dyskusji.

Co to jest partycjonowanie miejsca na dane?

Aby zapobiegać niektórym rodzajom śledzenia między witrynami, Chrome partycjonuje miejsce na dane oraz interfejsy API komunikacji w kontekstach podmiotów zewnętrznych.

Bez partycjonowania pamięci witryna może łączyć dane z różnych witryn, aby śledzić użytkownika w internecie. Pozwala też wbudowanej witrynie na ustalanie konkretnych stanów użytkownika w witrynie najwyższego poziomu za pomocą technik kanału bocznego, takich jak ataki na czas, XS-LeaksCOSI.

Wcześniej miejsce na dane było przypisywane tylko do źródła. Oznacza to, że jeśli iframe z witryny example.com jest umieszczony w witrynach a.comb.com, może ona poznać Twoje nawyki związane z przeglądaniem tych witryn, przechowując i odczytując identyfikator z miejsca do przechowywania. Gdy partycjonowanie pamięci przez podmiot zewnętrzny jest włączone, miejsce na dane example.com znajduje się w 2 różnych partycjach: jedna dla a.com, a druga dla b.com.

Dzielenie na partycje oznacza, że dane przechowywane przez interfejsy API do przechowywania, takie jak pamięć lokalna i IndexedDB za pomocą elementu iframe, nie są już dostępne dla wszystkich kontekstów w tej samej domenie. Zamiast tego dane są dostępne tylko w kontekstach o tej samej domenie i tej samej witrynie najwyższego poziomu.

Przed

Schemat interfejsów API pamięci bez partycjonowania.
Przed podziałem pamięci masowej witryna example.com może zapisywać dane, gdy jest umieszczona w witrynie a.com, a następnie odczytywać je, gdy jest umieszczona w witrynie b.com.

Po

Diagram interfejsów API pamięci masowej z partycjonowaniem
Po podzieleniu miejsca na dane domeny example.com, gdy jest ono umieszczone w domenie b.com, nie może uzyskać dostępu do miejsca na dane domeny example.com, gdy jest ono umieszczone w domenie a.com.

Partycjonowanie pamięci w przypadku połączonych elementów iframe

Gdy element iframe zawiera element iframe, sytuacja staje się bardziej skomplikowana. Jest to szczególnie ważne, gdy ta sama usługa jest używana w kilku miejscach w łańcuchu.

Na przykład komórka A1 zawiera iframe komórki B, która zawiera iframe komórki A2, a komórki A1 i A2 znajdują się w tej samej witrynie. Jeśli podczas dzielenia na partycje weźmiemy pod uwagę tylko konteksty najwyższego i bieżącego poziomu, iframe A2 może zostać uznany za domeny własne, ponieważ znajduje się na tej samej stronie co iframe najwyższego poziomu (A1), mimo że jest to iframe zewnętrzny (B). Jeśli A2 miałby domyślnie dostęp do niepartycjonowanego miejsca na dane, mógłby narazić A1 na zagrożenia związane z bezpieczeństwem, takie jak clickjacking.

Aby rozwiązać ten problem, Chrome zawiera dodatkowy „bit przodka” jako część klucza partycji pamięci masowej. Jest on ustawiany, jeśli jakikolwiek dokument między bieżącym kontekstem a kontekstem najwyższego poziomu jest dokumentem z innej witryny niż bieżący kontekst. W tym przypadku witryna B jest witryną wielowitrynową, więc bit jest ustawiony dla komórki A2, a jego pamięć jest wyodrębniona z komórki A1.

Jeśli w łańcuchu nie ma kontekstu między witrynami, pamięć nie jest dzielona na partycje. Na przykład witryna A1 zawierająca element iframe dla witryny A2, która zawiera element iframe dla witryny A3, nie zostanie podzielona na witryny A1, A2 ani A3, ponieważ wszystkie znajdują się w tej samej witrynie.

W przypadku witryn, które wymagają dostępu do niepartycjonowanych iframe’ów w łańcuchu, Chrome eksperymentuje z rozszerzeniem interfejsu Storage Access API, aby umożliwić to zastosowanie. Ponieważ interfejs Storage Access API wymaga, aby witryna w ramce wyraźnie wywołała interfejs API, zmniejsza to ryzyko kliknięcia.

Zaktualizowane interfejsy API

Interfejsy API objęte podziałem można podzielić na te grupy:

Interfejsy Storage API

  • System limitów
    System limitów służy do określania ilości miejsca na dysku zarezerwowanego na dane. System limitów zarządza każdą partycją jako oddzielnym zasobnikiem, aby określić, ile miejsca jest dozwolone i kiedy jest ono usuwane.
    Funkcja navigator.storage.estimate() zwraca informacje o partycji. Interfejsy API dostępne tylko w Chrome, takie jak window.webkitStorageInfonavigator.webkitTemporaryStorage, zostaną wycofane.
    IndexedDBpamięć podręczna używają nowego systemu limitów z partycjami.
  • Web Storage API
    Interfejs Web Storage API udostępnia mechanizmy, za pomocą których przeglądarki mogą przechowywać pary klucz-wartość. Istnieją 2 mechanizmy: pamięć lokalna i pamięć sesji. Obecnie nie są one zarządzane za pomocą limitów, ale nadal są dzielone.
  • System plików prywatnych Origin
    Interfejs File System API umożliwia witrynie odczytywanie lub zapisywanie zmian bezpośrednio w plikach i folderach na urządzeniu po przyznaniu przez użytkownika dostępu. System plików prywatnych źródła umożliwia przechowywanie prywatnych treści na dysku, do których użytkownik ma łatwy dostęp i które są podzielone na partycje.
  • Storage Bucket API
    Interfejs Storage Bucket API jest opracowywany na potrzeby Storage Standard, który konsoliduje różne interfejsy API pamięci, takie jak IndexedDB i localStorage, za pomocą nowej koncepcji zwanej zasobnikami. Dane przechowywane w zasobach i powiązane z nimi metadane są dzielone na partycje.
  • Nagłówek Clear-Site-Data
    Uwzględnienie nagłówka Clear-Site-Data w odpowiedzi umożliwia serwerowi wysłanie żądania wyczyszczenia danych zapisanych w przeglądarce użytkownika. Pamięć podręczna, pliki cookie i pamięć DOM można wyczyścić. Użycie nagłówka powoduje wyczyszczenie miejsca na dane tylko w ramach jednej partycji.
  • Adres URL bloba
    Blob to obiekt zawierający nieprzetworzone dane do przetworzenia. Można wygenerować URL bloba, aby uzyskać dostęp do zasobu. Magazyny adresów URL blobów nie są dzielone na partycje. Aby umożliwić nawigację w kontekście najwyższego poziomu do dowolnego adresu blob URL (dyskusja), pamięć blob URL może być podzielona według klastra agentów, a nie według witryny najwyższego poziomu. Ta funkcja nie jest jeszcze dostępna do testowania, a mechanizm partycjonowania może w przyszłości ulec zmianie.

Interfejsy API komunikacji

Oprócz interfejsów API pamięci partycjonowane są też interfejsy API komunikacji, które umożliwiają jednej konwersacji komunikowanie się przez granice pochodzenia. Zmiany te dotyczą głównie interfejsów API, które umożliwiają wykrywanie innych kontekstów za pomocą funkcji broadcastingu lub rendezvous w ramach tego samego źródła.

W przypadku tych interfejsów API do komunikacji elementy iframe innych firm nie mogą już komunikować się z kontekstem tej samej domeny:

  • Kanał transmisji
    Interfejs Broadcast Channel API umożliwia komunikację między kontekstami przeglądania (oknami, kartami lub elementami iframe) a instancjami roboczymi w tej samej domenie.
    Nie proponujemy zmiany iframe w wielu witrynach postMessage(), w których relacje między kontekstami są wyraźnie zdefiniowane.
  • SharedWorker
    Interfejs API SharedWorker udostępnia instancję roboczą, do której można uzyskać dostęp w różnych kontekstach przeglądania w ramach tej samej domeny.
  • Blokada internetowa
    Interfejs Web Locks API umożliwia kodowi działającemu w jednej karcie lub instancji roboczej tego samego źródła uzyskanie blokady na zasób udostępniony podczas wykonywania pewnych operacji.

Interfejs Service Worker API

Interfejs Service Worker API zapewnia interfejs do wykonywania zadań w tle. Witryny tworzą trwałe rejestracje, które tworzą nowy kontekst pracownika w odpowiedzi na zdarzenia. Ten pracownik może komunikować się z dowolnym kontekstem tego samego pochodzenia. Ponadto interfejs Service Worker API może zmieniać czas wysyłania żądań nawigacyjnych, co może prowadzić do wycieku informacji między witrynami, np. przeszukiwania historii.

Dlatego serwisy worker zarejestrowane w kontekście zewnętrznym są dzielone.

Interfejsy Extension API

Rozszerzenia to programy, które umożliwiają użytkownikom dostosowanie przeglądania do własnych potrzeb.

Strony rozszerzeń (strony ze schematem chrome-extension://) można umieszczać w witrynach w internecie. W takich przypadkach nadal będą one miały dostęp do partycji najwyższego poziomu. Strony te mogą też zawierać inne witryny. W takim przypadku te witryny będą miały dostęp do partycji najwyższego poziomu, o ile rozszerzenie ma uprawnienia hosta dla danej witryny.

Więcej informacji znajdziesz w dokumentacji rozszerzeń.

Demonstracja: testowanie partycjonowania miejsca na dane

Witryna demonstracyjna: https://storage-partitioning-demo-site-a.glitch.me/

Zrzut ekranu witryny demonstracyjnej pokazujący wszystkie zielone znaczniki po lewej stronie i czerwone krzyżyki po prawej stronie dla każdego testu
Zrzut ekranu z demonstracji przedstawiający wyniki działania przeglądarki z partycjonowaniem pamięci po lewej stronie i bez partycjonowania po prawej stronie

W tym filmie użyto 2 witryn: A i B.

  • Gdy odwiedzasz witrynę A w kontekście najwyższego poziomu, ustawia ona dane za pomocą różnych metod przechowywania.
  • Witryna B umieszcza na swojej stronie stronę z witryny A, a umieszczony element próbuje odczytać wcześniej ustawione opcje przechowywania.
  • Gdy witryna A jest umieszczona w witrynie B, nie ma dostępu do tych danych, gdy miejsce na dane jest podzielone na partycje, więc odczyty nie działają.
  • Prezentacja wykorzystuje powodzenie lub niepowodzenie poszczególnych odczytów, aby pokazać, czy dane są partycjonowane.

Obecnie możesz wyłączyć partycjonowanie pamięci w Chrome, używając --disable-features=ThirdPartyStoragePartitioning flagi wiersza poleceń.

Możesz też przetestować inne przeglądarki w taki sam sposób, aby sprawdzić stan partycjonowania.

Zaangażowanie i przesyłanie opinii