Omówienie
3 stycznia Project Zero ujawnił podatności w nowoczesnych procesorach, które proces może wykorzystać do odczytu (w najgorszym przypadku) dowolnej pamięci – w tym pamięci, która nie należy do tego procesu. Te luki w zabezpieczeniach zostały nazwane Spectre i Meltdown. Co robi Chrome, aby zapewnić bezpieczeństwo w internecie, i co powinni zrobić deweloperzy stron internetowych w przypadku swoich witryn?
TL; DR
Jako użytkownik przeglądający internet powinieneś pamiętać o aktualizowaniu systemu operacyjnego i przeglądarki. Użytkownicy Chrome mogą też rozważyć włączenie izolacji witryn.
Jeśli jesteś programistą stron internetowych, zespół Chrome zaleca:
- W miarę możliwości zapobiegaj umieszczaniu plików cookie w pamięci mechanizmu renderowania, używając atrybutów
SameSite
iHTTPOnly
oraz unikając odczytu zdocument.cookie
. - Aby w pełni korzystać z blokowania odczytu między domenami w przypadku użytkowników, którzy mają włączoną izolację witryn, sprawdź, czy typy MIME są prawidłowe, i określ nagłówek
X-Content-Type-Options: nosniff
dla adresów URL zawierających treści dotyczące konkretnego użytkownika lub treści poufne. - Włącz izolację witryn i poinformuj zespół Chrome, jeśli powoduje to problemy w Twojej witrynie.
Jeśli zastanawiasz się, dlaczego te czynności są pomocne, czytaj dalej.
Ryzyko
Istnieje wiele wyjaśnień tych luk, więc nie będę dodawać kolejnego. Jeśli chcesz dowiedzieć się, jak można wykorzystać te luki w zabezpieczeniach, przeczytaj ten post na blogu, który opublikowali moi koledzy z zespołu Google Cloud.
Zarówno Meltdown, jak i Spectre mogą pozwolić procesowi na odczyt pamięci, do której nie powinien mieć dostępu. Czasami kilka dokumentów z różnych witryn może korzystać z tego samego procesu w Chrome. Może się tak zdarzyć, gdy jedna aplikacja otworzy drugą za pomocą window.open
lub <a href="..." target="_blank">
albo za pomocą ramki osadzonej. Jeśli witryna zawiera dane użytkownika, istnieje ryzyko, że inna witryna wykorzysta te nowe luki, aby odczytać te dane.
Złagodzenia
Zespół inżynierów Chrome i V8 podejmuje wiele działań, aby ograniczyć to zagrożenie.
Izolacja witryn
Skutki skutecznego wykorzystania Spectre można znacznie ograniczyć, nie pozwalając, aby dane wrażliwe były udostępniane procesowi kontrolowanemu przez atakującego. Zespół Chrome pracował nad funkcją o nazwie „izolacja witryn”:
Izolacja witryn nie jest jeszcze domyślnie włączona, ponieważ występuje kilka znanych problemów, a zespół Chrome chce przeprowadzić jak najwięcej testów w warunkach rzeczywistych. Jeśli jesteś deweloperem witryn internetowych, włącz izolację witryn i sprawdź, czy Twoja witryna nadal działa. Jeśli chcesz to zrobić teraz, włącz tę opcję:
chrome://flags#enable-site-per-process
. Jeśli znajdziesz stronę, która nie działa, pomóż nam, zgłaszając błąd i wskazując, że masz włączoną izolację witryn.
Blokowanie dokumentów w witrynach zewnętrznych
Nawet jeśli wszystkie strony międzywitrynowe są umieszczane w osobnych procesach, mogą one nadal prawidłowo wysyłać żądania niektórych zasobów podrzędnych międzywitrynowych, takich jak obrazy i JavaScript. Aby zapobiec wyciekowi informacji poufnych, izolacja witryny obejmuje funkcję „blokowania dokumentów w wielu witrynach”, która ogranicza, które odpowiedzi sieciowe są dostarczane do procesu renderowania.
Witryna może prosić serwer o 2 typy danych: „dokumenty” i „zasoby”. Dokumenty to pliki HTML, XML, JSON i pliki tekstowe. Witryna może odbierać dokumenty z własnej domeny lub z innych domen z dopuszczającymi nagłówkami CORS. Zasoby to m.in. obrazy, JavaScript, CSS i czcionki. Zasoby mogą pochodzić z dowolnej witryny.
Zasada blokowania dokumentów w wielu witrynach uniemożliwia procesowi odbieranie „dokumentów” z innych źródeł, jeśli:
- mają typ MIME HTML, XML, JSON lub text/plain.
- Mają nagłówek odpowiedzi HTTP
X-Content-Type-Options: nosniff
lub szybka analiza treści („skanowanie”) potwierdza, że typ jest prawidłowy. - CORS nie zezwala wyraźnie na dostęp do dokumentu.
Dokumenty zablokowane przez te zasady są przedstawiane w procesie jako puste, chociaż żądanie jest nadal realizowane w tle.
Przykład: wyobraź sobie, że atakujący tworzy tag <img>
, który zawiera plik JSON z danymi poufnymi, np. <img src="https://yourbank.com/balance.json">
.
Bez funkcji izolacji witryny zawartość pliku JSON trafia do pamięci procesu renderowania, gdzie jest wykrywana jako nieprawidłowy format obrazu i nie jest renderowana. Jednak w przypadku Spectre istnieje teraz sposób na odczytanie tego fragmentu pamięci. Blokowanie dokumentów w wielu witrynach uniemożliwiłoby umieszczenie zawartości tego pliku w pamięci procesu, w którym działa renderowanie, ponieważ typ MIME jest blokowany przez blokowanie dokumentów w wielu witrynach.
Według danych dotyczących użytkowników wiele plików JavaScript i CSS jest dostarczanych z typami MIME text/html
lub text/plain
. Aby uniknąć blokowania zasobów, które są przypadkowo oznaczone jako dokumenty, Chrome próbuje skanować odpowiedź, aby sprawdzić, czy typ MIME jest prawidłowy. Ta funkcja wykrywania nie jest doskonała, dlatego jeśli masz pewność, że w swojej witrynie ustawiasz prawidłowe nagłówki Content-Type
, zespół Chrome zaleca dodawanie nagłówka X-Content-Type-Options: nosniff
do wszystkich odpowiedzi.
Jeśli chcesz spróbować blokowania dokumentów w wielu witrynach, włącz izolację witryn w sposób opisany powyżej.
Pliki cookie: SameSite
Wróćmy do przykładu powyżej: <img
src="https://yourbank.com/balance.json">
. Działa to tylko wtedy, gdy witryna yourbank.com przechowuje plik cookie, który automatycznie loguje użytkownika. Pliki cookie są zwykle wysyłane w przypadku wszystkich żądań do witryny, która je ustawia, nawet jeśli żądanie zostało wysłane przez stronę trzecią za pomocą tagu <img>
. Pliki cookie SameSite to nowy atrybut, który określa, że plik cookie powinien być dołączany tylko do żądania pochodzącego z tej samej witryny. Niestety w momencie pisania tego artykułu ten atrybut jest obsługiwany tylko w Chrome i Firefox 58 lub nowszym.
HTTPOnly
i document.cookie
Jeśli pliki cookie Twojej witryny są używane tylko po stronie serwera, a nie przez klienta JavaScript, możesz uniemożliwić przekazywanie danych z plików cookie do procesu renderowania. Możesz ustawić atrybut pliku cookie HTTPOnly
, który wyraźnie uniemożliwia dostęp do pliku cookie za pomocą skryptu po stronie klienta w obsługiwanych przeglądarkach, takich jak Chrome. Jeśli ustawienie wartościHTTPOnly
nie jest możliwe, możesz ograniczyć narażenie danych pliku cookie wczytywania na proces renderowania, nie odczytując wartościdocument.cookie
, chyba że jest to absolutnie konieczne.
Otwieranie linków zewnętrznych za pomocą rel="noopener"
Gdy tworzysz link do innej strony za pomocą elementu target="_blank"
, otwarta strona ma dostęp do obiektu window
, może przejść na inny adres URL, a jeśli nie jest odizolowana, będzie działać w ramach tego samego procesu co Twoja strona. Aby lepiej chronić swoją stronę, w przypadku linków do stron zewnętrznych, które otwierają się w nowym oknie, zawsze określaj rel="noopener"
.
Liczniki w wysokiej rozdzielczości
Aby wykorzystać Meltdown lub Spectre, atakujący musi zmierzyć, ile czasu zajmuje odczyt określonej wartości z pamięci. Do tego potrzebny jest niezawodny i dokładny minutnik.
Platforma internetowa udostępnia interfejs API performance.now()
, który umożliwia pomiary z dokładnością do 5 mikrosekund. W ramach działań zapobiegawczych wszystkie główne przeglądarki zmniejszyły rozdzielczość performance.now()
, aby utrudnić przeprowadzanie ataków.
Innym sposobem uzyskania zegara o wysokiej rozdzielczości jest użycie obiektu SharedArrayBuffer. Bufor jest używany przez dedykowany proces roboczy do zwiększania licznika. Główny wątek odczytuje ten licznik i użyje go jako minutnika. Na razie przeglądarki zdecydowały się wyłączyć SharedArrayBuffer, dopóki nie zostaną wdrożone inne środki zaradcze.
V8
Aby wykorzystać Spectre, potrzebna jest specjalnie przygotowana sekwencja instrukcji procesora. Zespół V8 wdrożył środki zaradcze na wypadek znanych ataków typu proof of concept i pracuje nad zmianami w TurboFan, czyli kompilatorze optymalizacyjnym, które zapewnią bezpieczeństwo wygenerowanego kodu nawet w przypadku uruchomienia tych ataków. Jednak zmiany w generowaniu kodu mogą mieć negatywny wpływ na wydajność.
Ochrona internetu
Odkrycie podatności Spectre i Meltdown oraz ich konsekwencje wywołały wiele niepewności. Mam nadzieję, że ten artykuł przybliża, co robią zespoły Chrome i V8, aby chronić platformę internetową, oraz jak deweloperzy mogą pomóc, korzystając z dostępnych funkcji bezpieczeństwa. Jeśli masz pytania, skontaktuj się ze mną na Twitter.