Meltdown/Spectre

Opis

3 stycznia Project Zero ujawnił luki w zabezpieczeniach nowoczesnych procesorów, które mogą wykorzystać proces do odczytu (w najgorszym razie) dowolnej pamięci – w tym pamięci, która nie należy do tego procesu. Te luki w zabezpieczeniach noszą nazwy Spectre i Meltdown. Co robi Chrome, aby zapewnić bezpieczeństwo sieci, a co programiści powinni robić na swoich stronach?

TL; DR

Jako użytkownik przeglądającego internet musisz aktualizować swój system operacyjny i przeglądarkę. Dodatkowo użytkownicy Chrome mogą włączyć izolację witryn.

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

  • Jeśli to możliwe, zablokuj pliki cookie przed wejściem do pamięci procesu renderowania, korzystając z atrybutów plików cookie SameSite i HTTPOnly oraz unikając odczytu z elementu 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 specyficzne dla użytkowników lub poufne. Pozwoli to w pełni wykorzystać możliwości blokowania 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 sprawia to problemy w witrynie.

Jeśli zastanawiasz się, dlaczego te czynności mogą pomóc, czytaj dalej.

Ryzyko

Istnieje wiele przyczyn tych luk, dlatego nie zamierzam dodawać kolejnego. Jeśli chcesz się dowiedzieć, jak można wykorzystać te luki w zabezpieczeniach, przeczytaj posta na blogu autorstwa moich współpracowników z zespołu Google Cloud.

Zarówno Meltdown, jak i Spectre mogą umożliwiać procesowi odczytywanie pamięci, której nie powinien. Czasem wiele dokumentów z różnych witryn może współdzielić proces w Chrome. Może się tak zdarzyć, gdy jeden z nich otworzy inne za pomocą elementów window.open, <a href="..." target="_blank"> lub elementów iframe. Jeśli witryna zawiera dane dotyczące konkretnego użytkownika, istnieje możliwość, że inna witryna mogłaby wykorzystać te nowe luki w zabezpieczeniach do odczytania tych danych.

Łagodzenie

Zespół inżynierów Chrome i V8 podejmuje szereg działań mających na celu zniwelowanie tego zagrożenia.

Izolacja witryn

Skutki skutecznego wykorzystania Spectre mogą być znacznie ograniczone przez uniemożliwienie dostępu danych wrażliwych do procesu, który został zabezpieczony przez atakującego. Zespół Chrome pracuje nad funkcją, która pozwoli to osiągnąć tzw. „izolację witryn”:

Izolacja witryn nie jest jeszcze włączona domyślnie, ponieważ wystąpiło kilka znanych problemów, a zespół Chrome chce przeprowadzić jak najwięcej testów funkcjonalnych. Jeśli jesteś programistą stron internetowych, włącz izolację witryn i sprawdź, czy witryna działa. Jeśli chcesz wyrazić zgodę od razu, włącz chrome://flags#enable-site-per-process. Jeśli znajdziesz witrynę, która nie działa, pomóż nam, zgłaszając błąd i informując, że masz włączoną izolację witryn.

Blokowanie dokumentów w różnych witrynach

Nawet wtedy, gdy wszystkie strony w różnych witrynach zostaną umieszczone w osobnych procesach, mogą one nadal prosić o dostęp do pewnych zasobów podrzędnych, np. obrazów i JavaScriptu. Aby zapobiec wyciekowi informacji poufnych, izolacja witryn obejmuje funkcję blokowania dokumentów między witrynami, która ogranicza odpowiedzi sieci dostarczane w procesie renderowania.

Witryna może zażądać z serwera 2 typów danych: „dokumentów” i „zasobów”. W tym przypadku dokumenty to pliki HTML, XML, JSON i tekstowe. Witryna może otrzymywać dokumenty z własnej domeny lub z innych domen z dopuszczalnymi nagłówkami CORS. Zasoby to m.in. obrazy, JavaScript, CSS i czcionki. Zasoby można umieścić z dowolnej witryny.

Zasady blokowania dokumentów z innych witryn uniemożliwiają procesowi odbieranie „dokumentów” z innych witryn, jeśli:

  1. Mają typ MIME w formacie HTML, XML, JSON lub tekstowym/zwykłym.
  2. Zawierają nagłówek odpowiedzi HTTP X-Content-Type-Options: nosniff lub szybka analiza treści („węchowanie”) potwierdza, że ich typ jest prawidłowy.
  3. CORS nie zezwala bezpośrednio na dostęp do dokumentu

Dokumenty zablokowane przez tę zasadę są przedstawiane procesowi jako puste, chociaż żądanie nadal odbywa się w tle.

Wyobraź sobie na przykład, że osoba przeprowadzająca atak tworzy tag <img> zawierający plik JSON z danymi wrażliwymi, takimi jak <img src="https://yourbank.com/balance.json">. Bez izolacji witryn zawartość pliku JSON znalazłaby się w pamięci procesu renderowania, wówczas mechanizm renderowania zauważył, że nie jest to prawidłowy format obrazu, więc nie renderowałby obrazu. Jednak Spectre może też potencjalnie odczytać ten fragment pamięci. Blokowanie dokumentów w różnych witrynach uniemożliwiłoby dostęp 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 typem MIME text/html lub text/plain. Aby uniknąć blokowania zasobów, które zostały przypadkowo oznaczone jako dokumenty, Chrome próbuje przechwycić odpowiedź w celu sprawdzenia, czy typ MIME jest poprawny. Wykrywanie nie jest doskonałe, 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 wypróbować blokowanie dokumentów z różnych witryn, włącz izolację witryn w sposób opisany powyżej.

Pliki cookie: SameSite

Wróćmy do powyższego przykładu: <img src="https://yourbank.com/balance.json">. Będzie to działać tylko wtedy, gdy bank.com przechowuje plik cookie, który automatycznie loguje użytkownika. Pliki cookie są zwykle wysyłane w przypadku wszystkich żądań wysyłanych do witryny, która ustawia plik cookie – nawet jeśli żądanie zostało wysłane przez firmę zewnętrzną za pomocą tagu <img>. Pliki cookie SameSite to nowy atrybut, który określa, że plik cookie powinien być dołączony tylko do żądania pochodzącego z tej samej witryny – stąd nazwa. Obecnie ten atrybut obsługuje tylko Chrome i Firefox w wersji 58 lub nowszej.

HTTPOnlydocument.cookie

Jeśli pliki cookie w Twojej witrynie są używane tylko po stronie serwera, a nie przez kod JavaScript klienta, masz kilka sposobów na zablokowanie danych z plików cookie w procesie renderowania. Możesz ustawić atrybut pliku cookie HTTPOnly, który jednoznacznie 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ć ryzyko wczytywania danych z plików cookie do renderowanego procesu, nie odczytując pola document.cookie, chyba że jest to absolutnie konieczne.

Gdy dodajesz link do innej strony za pomocą target="_blank", otwarta strona ma dostęp do obiektu window i może przejść pod inny adres URL. Bez izolacji witryny działa ten sam proces co strona. Aby lepiej chronić stronę, linki do stron zewnętrznych, które otwierają się w nowym oknie, powinny zawsze określać rel="noopener".

Minutniki w wysokiej rozdzielczości

Aby wykorzystać Meltdown lub Spectre, atakujący musi zmierzyć, ile czasu zajmuje odczytanie określonej wartości z pamięci. Potrzebny jest do tego niezawodny i dokładny minutnik.

Jeden interfejs API oferowany przez platformę internetową to performance.now() z dokładnością do 5 mikrosekund. Aby złagodzić skutki tych ataków, wszystkie popularne przeglądarki zmniejszyły rozdzielczość performance.now(), aby utrudnić przeprowadzenie ataków.

Innym sposobem na uzyskanie licznika w 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 czasu. Przeglądarki włączały na razie tę funkcję, dopóki nie zostaną wprowadzone inne środki łagodzące.

V8

Aby wykorzystać Spectre, potrzebna jest specjalnie stworzona sekwencja instrukcji procesora. Zespół V8 wdrożył środki łagodzące znane jako „test koncepcyjny” i pracuje nad zmianami w optymalizacyjnym kompilatorze TurboFan, które sprawią, że wygenerowany kod będzie bezpieczny nawet po wywołaniu takich ataków. Jednak te zmiany w generowaniu kodu mogą się wiązać z karą za wydajność.

Bezpieczeństwo w internecie

Odkrycie Spectre i Meltdown oraz ich skutków wiąże się z wieloma niepewnością. Mam nadzieję, że ten artykuł rzucił trochę światła na to, co zespoły Chrome i V8 robią, aby zapewnić bezpieczeństwo platformy internetowej, oraz o tym, jak programiści stron internetowych mogą pomóc, korzystając z istniejących funkcji zabezpieczeń. Jeśli masz pytania, skontaktuj się ze mną na Twitterze.