Meltdown/Spectre

Przegląd

3 stycznia projekt Zero ujawnił luki w zabezpieczeniach nowoczesnych procesorów, których proces może używać do odczytu (w najgorszej sytuacji) pamięci, która nie należy do tego procesu. Luki w zabezpieczeniach nosiły nazwy Spectre i Meltdown. Co robi Chrome, by pomóc w zapewnieniu bezpieczeństwa sieci, i co deweloperzy powinni robić w przypadku swoich stron?

TL; DR

Jako użytkownik przeglądający internet upewnij się, że Twój system operacyjny i przeglądarka są aktualne. Użytkownicy Chrome mogą też rozważyć włączenie izolacji witryn.

Jeśli jesteś programistą stron internetowych, zespół Chrome zaleca:

  • Gdy tylko jest to możliwe, zapobiegaj wpuszczaniu plików cookie do pamięci procesu renderowania, korzystając z atrybutów SameSite i HTTPOnly plików cookie oraz unikając odczytu z obiektu document.cookie.
  • Upewnij się, że typy MIME są prawidłowe i określ nagłówek X-Content-Type-Options: nosniff dla wszystkich adresów URL zawierających treści poufne lub przeznaczone dla użytkowników, aby jak najlepiej wykorzystać blokowanie odczytu z różnych domen w przypadku użytkowników, którzy mają włączoną izolację witryn.
  • Włącz izolację witryn i poinformuj zespół Chrome, jeśli powoduje to problemy w witrynie.

Jeśli zastanawiasz się, dlaczego te kroki są przydatne, zapoznaj się z dalszą częścią artykułu.

Ryzyko

Te luki w zabezpieczeniach można wyjaśnić na wiele różnych sposobów, więc nie będę dodawał kolejnego komentarza. Jeśli chcesz się dowiedzieć, jak można wykorzystać te luki w zabezpieczeniach, zachęcam do zapoznania się z postem na blogu autorstwa moich współpracowników z zespołu Google Cloud.

Zarówno Meltdown, jak i Spectre, potencjalnie umożliwiają procesowi odczytu pamięci, którym nie powinien. Czasami wiele dokumentów z różnych witryn może w końcu udostępnić jeden proces w Chrome. Może się tak zdarzyć, gdy ktoś otworzy drugą za pomocą window.open, <a href="..." target="_blank"> lub elementów iframe. Jeśli witryna zawiera dane związane z użytkownikami, inna witryna może wykorzystać te luki w zabezpieczeniach do odczytania tych danych.

Łagodzenie

Zespół inżynierów Chrome i V8 podejmuje wiele działań, aby ograniczyć to zagrożenie.

Izolacja witryn

Efektywnego wykorzystania technologii Spectre można znacznie ograniczyć, zapobiegając udostępnianiu danych wrażliwych w ogóle za pomocą kodu kontrolowanego przez atakującego. Zespół Chrome pracuje nad funkcją „izolacja witryn”, która ma umożliwić takie działanie:

Izolacja witryn nie jest jeszcze domyślnie włączona ze względu na występowanie kilku znanych problemów, a zespół Chrome prosi o jak najwięcej testów pól. Jeśli jesteś programistą stron internetowych, włącz izolację witryn i sprawdź, czy Twoja witryna nadal działa. Jeśli chcesz od razu to zrobić, włącz chrome://flags#enable-site-per-process. Jeśli natrafisz na stronę, która nie działa, pomóż nam, zgłaszając błąd i zaznacz, że masz włączoną izolację witryn.

Blokowanie dokumentów w różnych witrynach

Nawet wtedy, gdy wszystkie strony w różnych witrynach są przetwarzane w osobnych procesach, strony nadal mogą w słuszny sposób żądać pewnych zasobów podrzędnych z innych witryn, np. obrazów i JavaScriptu. Aby zapobiec wyciekowi informacji poufnych, izolacja witryn obejmuje funkcję blokowania dokumentów z innych witryn, która ogranicza liczbę odpowiedzi sieciowych dostarczanych do procesu renderowania.

Witryna może zażądać z serwera 2 typów danych: „dokumentów” i „zasobów”. Dokumenty to dokumenty w formacie HTML, XML, JSON i pliki tekstowe. Witryna może odbierać dokumenty ze swojej domeny lub z innych domen przy rygorystycznych nagłówkach CORS. Są to m.in. obrazy, JavaScript, CSS i czcionki. Zasoby mogą pochodzić z dowolnej witryny.

Zasada blokowania dokumentów z innych witryn uniemożliwia procesowi odbieranie „dokumentów” z innych źródeł, jeśli:

  1. Mają typ MIME HTML, XML, JSON lub tekstowy/zwykły
  2. Zawierają nagłówek odpowiedzi HTTP X-Content-Type-Options: nosniff lub szybką analizę treści („sniffing”) w celu potwierdzenia, że typ jest prawidłowy
  3. CORS nie zezwala wprost na dostęp do dokumentu

Dokumenty zablokowane przez tę zasadę są wyświetlane w tym procesie jako puste, mimo że żądanie nadal odbywa się w tle.

Wyobraź sobie na przykład, że osoba przeprowadzająca atak tworzy tag <img>, który zawiera plik JSON z danymi poufnymi, np. <img src="https://yourbank.com/balance.json">. Bez izolacji witryny zawartość pliku JSON znalazłaby się w pamięci procesu renderującego, co oznacza, że mechanizm renderowania zauważył, że nie jest to prawidłowy format obrazu i nie wyrenderuje obrazu. Spectre ma teraz jednak sposób na możliwe odczytanie fragmentu pamięci. Blokowanie dokumentów w innych witrynach uniemożliwiłoby dotarcie zawartości tego pliku do pamięci procesu, w którym działa mechanizm renderowania, ponieważ typ MIME jest blokowany przez blokowanie dokumentów z innych witryn.

Z danych o użytkownikach wynika, że wiele plików JavaScript i CSS jest dostarczanych z typami MIME text/html lub text/plain. Aby uniknąć blokowania zasobów, które zostały przypadkowo oznaczone jako dokumenty, Chrome próbuje wykryć odpowiedź, aby upewnić się, że typ MIME jest poprawny. Taki sposób wykrywania nie jest idealny, więc jeśli masz pewność, że ustawiasz w witrynie prawidłowe nagłówki Content-Type, zespół Chrome zaleca dodanie nagłówka X-Content-Type-Options: nosniff do wszystkich odpowiedzi.

Jeśli chcesz spróbować blokować dokumenty w różnych witrynach, zaakceptuj 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 na stronie twójbank.com jest zapisany plik cookie, który automatycznie rejestruje użytkownika. Pliki cookie są zwykle wysyłane w przypadku wszystkich żądań do witryny, która ustawia plik cookie – nawet wtedy, gdy żądanie pochodzi od firmy zewnętrznej z wykorzystaniem 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, dlatego pochodzi z niej nazwa. W momencie tworzenia tego tekstu tylko Chrome i Firefox w wersji 58 i nowszych obsługują ten atrybut.

HTTPOnlydocument.cookie

Jeśli pliki cookie w Twojej witrynie są używane tylko po stronie serwera, a nie przez kod JavaScript klienta, istnieje kilka sposobów, aby uniemożliwić uwzględnianie ich danych w procesie 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 HTTPOnly nie jest możliwe, możesz ograniczyć ekspozycję danych z plików cookie do renderowania. Aby to zrobić, nie odczytuj pola document.cookie, chyba że jest to absolutnie konieczne.

Gdy stworzysz link do innej strony przy użyciu parametru target="_blank", otwarta strona ma dostęp do obiektu window i może przejść na Twoją stronę pod inny adres URL. Jeśli nie użyjesz izolacji witryny, będzie ona działać tak samo jak strona. Aby lepiej chronić Twoją stronę, linki do zewnętrznych stron otwieranych w nowym oknie powinny zawsze określać rel="noopener".

Minutniki o wysokiej rozdzielczości

Aby wykorzystać atak Meltdown lub Spectre, atakujący musi zmierzyć, ile czasu zajmuje odczytanie określonej wartości z pamięci. Aby to zrobić, potrzebny jest niezawodny i dokładny licznik czasu.

Jeden z interfejsów API oferowanych przez platformę internetową to performance.now() z dokładnością do 5 mikrosekund. W ramach złagodzeń wszystkie popularne przeglądarki zmniejszyły rozdzielczość performance.now(), co utrudniało przeprowadzenie ataków.

Innym sposobem na uzyskanie licznika czasu o wysokiej rozdzielczości jest użycie obiektu SharedArrayBuffer. Bufor jest używany przez dedykowaną instancję roboczą do zwiększania licznika. Wątek główny odczytuje ten licznik i używa go jako licznika. Na razie przeglądarki wyłączają SharedTrackBuffer do czasu wprowadzenia innych środków łagodzących.

V8

Do wykorzystania Spectre potrzebna jest specjalnie przygotowana sekwencja instrukcji dotyczących procesora. Zespół V8 wdrożył środki łagodzące znane dowody ataku koncepcyjnego i pracuje nad zmianami w optymalizowanym kompilatorze TurboFan, dzięki którym wygenerowany kod będzie bezpieczny nawet po uruchomieniu ataków. Za takie zmiany związane z generowaniem kodu może się jednak wiązać kara za wydajność.

Bezpieczeństwo w internecie

Odkrycie Spectre i Meltdown oraz ich skutków jest bardzo niepewne. Mam nadzieję, że ten artykuł przybliży Ci, co robią zespoły Chrome i V8, aby zapewnić bezpieczeństwo platformy internetowej, i jak programiści mogą pomóc, korzystając z istniejących funkcji zabezpieczeń. Jeśli masz pytania, skontaktuj się ze mną na Twitterze.