Spook.js, przerażająca bajka na dobranoc

Jak działa Spook.js, pierwszy praktyczny atak wykorzystujący lukę Spectre.

Atak phishingowy wygląda mniej więcej tak: klikasz link, lądujesz na szkodliwej stronie, wprowadzasz pewne szczegóły, a atakujący je kradnie. Albo: klikasz link, a atakujący kradnie Twoje dane. Dziś opowiemy o szkodliwych stronach, które do kradzieży danych wykorzystują podstawową funkcję procesora i nie wymagają przy tym od ofiary wprowadzenia jakichkolwiek danych. Co więcej, luka w zabezpieczeniach, o której mowa, jest bardzo trudna (a może nawet niemożliwa) do wyeliminowania.

W 2018 roku badacze udowodnili, że scenariusz ten jest teoretycznie możliwy, i pokazali dwa pierwsze warianty podatności Spectre. Trzy lata później, we wrześniu 2021 r., nastąpił pierwszy prawdziwy atak z wykorzystaniem jej pierwszej wersji. Znana pod nazwą Spook.js koncepcja ataku jest dość skomplikowana, ale postaramy się ją wyjaśnić.

Podstawowe informacje na temat pierwszej wersji luki Spectre

Wiadomości o pierwszych dwóch atakach z tej rodziny — Spectre i Meltdown — pojawiły się w 2018 roku. Ataki wykorzystywały mechanizm przewidywania rozgałęzień, który ma na celu przyspieszenie wykonywania poleceń. Występuje on we wszystkich nowoczesnych procesorach.

Gdy użytkownik wprowadza poprawne hasło, aby zalogować się do witryny, wykonywany jest jeden zestaw instrukcji. Jeśli hasło to jest nieprawidłowe, wykonywany jest inny zestaw. Jednak przed otrzymaniem odpowiedzi procesor zaczyna wykonywać zestaw instrukcji, które najprawdopodobniej będą mu potrzebne — i w tym miejscu rozpoczyna się przewidywanie rozgałęzień.

Jeśli w naszym przykładzie hasło zostało wprowadzane poprawnie wiele razy wcześniej, procesor założy, że tym razem nie będzie inaczej. Jeśli to prawda, wydajność rośnie. Jeśli nie, procesor odrzuca spekulacyjnie wykonywane instrukcje i uruchamia drugi zestaw.

W ataku wykorzystującym lukę Spectre podejmowana jest próba odczytania obszaru danych, do którego program nie ma dostępu. W pierwszym etapie ataku wykonuje się wiele odwołań do obszarów danych o dostępie otwartym, przy czym system przewidywania rozgałęzień jest „trenowany” pod kątem wykonywania zabronionej operacji odczytu. Korzystając z przewidywania rozgałęzień, procesor wykonuje operację z wyprzedzeniem, ponieważ jest przyzwyczajony, że program prosi o odczytanie danych, które faktycznie może odczytać. Jednak w trakcie kontoli okazuje się, że program nie może uzyskać dostępu do danych, więc spekulatywnie wykonywane obliczenia są odrzucane. Równocześnie dane odczytywane przez procesor są przez pewien czas przechowywane w pamięci podręcznej, czyli pamięci własnej procesora.

Następnie pojawia się najciekawsza część: nie mając możliwości bezpośredniego odczytania poufnych danych z pamięci podręcznej procesora, szkodliwy proces wdraża tak zwany atak boczny, aby je ukraść. W tym celu dokonywany jest pomiar szybkości dostępu do pewnych informacji. Jeśli jest ona stosunkowo niewielka, oznacza to, że dane znajdują się w pamięci podręcznej. Jeśli jest duża — są one ładowane ze zwykłej pamięci RAM. Ustalona sekwencja prób odczytu powoduje wyciek tajnych informacji.

W efekcie mamy do czynienia z podstawową wadą procesora, a jedynym wyjściem jest tu całkowite wyłączenie przewidywania rozgałęzień, co poważnie wpływa na wydajność. W związku z tym ataki z użyciem luki w zabezpieczeniach Specter mają wiele ograniczeń:

  • osoba atakująca musi być w stanie wykonać kod programu na komputerze docelowym lub urządzeniu mobilnym,
  • atak wymaga użycia określonego programu docelowego zakodowanego w taki sposób, aby stworzyć warunki do udanego ataku,
  • nawet jeśli atak zakończy się sukcesem, ekstrakcja danych jest bardzo powolna — obejmuje dziesiątki lub setki bajtów na sekundę — a przy tym często występują błędy w odczycie,
  • ogólnie kradzież wybranych tajnych danych, takich jak hasła, klucze szyfrowania itp., wymaga połączenia kilku warunków.

Spook.js — rzeczywiste użycie luki Spectre v1

Można dojść do wniosku, że luka Spectre nie jest aż tak niebezpieczna. W końcu, jeśli atakujący może wykonać kod na komputerze docelowym, wykorzystanie jednej z wielu luk w systemie operacyjnym lub zainstalowanych programach w celu eskalacji uprawnień i kradzieży danych będzie znacznie prostsze.

To prawda, ale nowoczesne strony internetowe zawierają również duże ilości kodu programu, który jest wykonywany na komputerze użytkownika, w przeglądarce. W ten sposób ataki Spook.js wykorzystują lukę Spectre v1: zainfekowana strona ładuje się, przeglądarka wykonuje kod, a cyberprzestępca kradnie poufne dane.

Autorzy pewnego raportu zademonstrowali kilka praktycznych ataków. Najpierw ukradli hasło użytkownika z serwisu Tumblr. Następnie ukradli dane z Lastpass. Na koniec przechwycili obraz przesłany przez użytkownika z prywatnej pamięci na serwerze Google.

Wszystko to było możliwe za sprawą funkcji przeglądarki Google Chrome. Od czasu opublikowania informacji o luce Spectre programiści Chrome’a podjęli działania mające na celu odparcie potencjalnych ataków — strony internetowe ładują się w izolacji. Każda strona internetowa tworzy własny proces, więc jeśli na jednej z nich zostanie umieszczony szkodliwy kod, nie będzie on mógł zostać użyty do kradzieży danych z innego zasobu. Jest jednak jeden wyjątek: wiele stron z tej samej witryny lub domeny jest zgrupowanych razem we wspólnym procesie przeglądarki. Jeśli szkodliwy kod (napisany w języku JavaScript, stąd „.js” w nazwie ataku) zostanie uruchomiony na jednym z nich, dane na innych stronach mogą zostać skradzione.

Atak Spectre.js na serwis Tumblr

Jako blog zbiorowy, Tumblr może hostować szkodliwy kod (przynajmniej w teorii). W ten sposób, gdy na jednej karcie otwarta będzie szkodliwa strona, a użytkownik spróbuje zalogować się na swoje konto w tej usłudze na innej karcie, przeglądarka zapisze i automatycznie wypełni nazwę użytkownika i hasło — które złośliwy kod może ukraść.

Wykorzystujący lukę Spectre atak może wchodzić w interakcje z inną kartą z tej samej witryny i kraść dane w sposób pośredni. Udany atak z wykorzystaniem tego podejścia nie pozostawia prawie żadnych śladów.

Atak Specter.js na LastPass

Atak na menedżer haseł LastPass różnił się tym, że kod do kradzieży danych za pomocą Spectre v1 został osadzony w szkodliwym rozszerzeniu dla Google Chrome, które również było uruchomione w przeglądarce. W niektórych przypadkach rozszerzenia są również wykonywane we wspólnym procesie przeglądarki, co umożliwia kradzież danych.

Atak Specter.js na Google Cloud Storage

Inny przykład wykorzystuje ataki na magazyn w chmurze Google: na jednej karcie przeglądarki otwarta jest szkodliwa strona hostowana w witrynie sites.google.com, inna pozwala użytkownikom przesyłać obrazy do ich prywatnego miejsca w usłudze G Suite. W tym scenariuszu osoba atakująca może użyć szkodliwego kodu, aby uzyskać dostęp do obrazów.

Oryginalny obraz (po lewej) i skradziony z pamięci Google w chmurze za pomocą ataku Spook.js. Źródło

Jakie ograniczenia ma ta metoda

Naukowcy zaprezentowali, w jaki sposób atak można przeprowadzić na różnych procesorach, w tym na kilku nowszych marki Intel, a nawet na nowym Apple M1 opartym na architekturze ARM. We wszystkich przypadkach atak został przeprowadzony przy użyciu przeglądarki Google Chrome, a to za sprawą jej kilku unikatowych funkcji. Na ten atak podatne są również inne przeglądarki oparte na Chromium, takie jak Microsoft Edge.

Istnieją jednak pewne ograniczenia. Pierwszym z nich jest niska prędkość kradzieży danych (400-600 bajtów na sekundę, w zależności od procesora) — z tego powodu plik docelowy w ostatniej prezentacji jest bardzo mały. Drugim jest duża liczba błędów podczas kradzieży danych z pamięci podręcznej procesora — odsetek ten może tu sięgać nawet 4%, stąd obecność artefaktów w skradzionej kopii obrazu.

Atak nie działa na procesorach AMD ani w przeglądarce Mozilla Firefox, których silnik JavaScript działa inaczej. Badacze nie wykluczają możliwości przeprowadzenia udanego ataku na układy AMD i przeglądarkę Firefox, ale wymaga to przeprowadzenia dalszych badań.

Atak wymaga przesłania szkodliwego kodu na stronę o tej samej nazwie domeny, tak jak to miało miejsce w przypadku zbiorowych blogów lub hostingu. Zastosowanie tej metody na przykład do strony internetowej banku prawdopodobnie nie zadziała.

Nie ma powodu do paniki

Badanie związane z luką Spook.js jest ważne, ponieważ badacze po raz pierwszy byli w stanie zademonstrować dość realistyczny scenariusz wykorzystania jednej z luk Spectre. Niemniej jednak szanse na atak w świecie rzeczywistym są małe. Po pierwsze dlatego, że na podstawie tych badań twórcy przeglądarki Google Chrome wzmocnili mechanizm izolowania od siebie załadowanych witryn. Po drugie, cyberprzestępcy mają do dyspozycji wiele łatwiejszych sposobów na kradzież danych użytkowników, od tradycyjnego szkodliwego oprogramowania po socjotechnikę, a opisywana metoda wymaga posiadania obszernej wiedzy na temat niskopoziomowego działania nowoczesnych procesorów.

Jako praca naukowa, Spook.js ma na celu zmianę krajobrazu oprogramowania poprzez wprowadzenie nowych zaleceń dotyczących bezpieczeństwa stron internetowych (na przykład autorzy proponują przeniesienie stron autoryzacyjnych do osobnej nazwy domeny). Być może w trakcie kolejnych badań zostaną znalezione sposoby na ułatwienie ataków, ale najprawdopodobniej doprowadzą one do zwiększenia ulepszeń w zakresie bezpieczeństwa. Nawet jeśli luki typu Spectre mogą być wykorzystywane masowo, środki ochrony będą takie same jak w przypadku każdego innego szkodliwego oprogramowania. Dostawcy zabezpieczeń zwyczajnie dodadzą nowe typy ataków do listy tych, które mają być monitorowane i blokowane przed uruchomieniem.

Możliwe jest również, że pewnego dnia badacze natkną się na cechę luk podobnych do Spectre, która wymusi poważną przeróbkę całego nowoczesnego ekosystemu IT. Jednak jest to mało prawdopodobne. Nie zapominajmy, że czas od teoretycznej luki do pierwszego praktycznego ataku wyniósł trzy lata (a ponadto atak ten ma wiele ograniczeń).

Luka Spectre może być również wykorzystywana do przeprowadzania ataków ukierunkowanych, w których potencjalna korzyść ze skradzionych danych przewyższa koszty operacji. Nawet jeśli ten scenariusz mógłby zostać użyty przeciwko Twojej organizacji, możesz łatwo utrudnić jego realizację, używając różnych przeglądarek dla różnych treści. Na przykład nie otwieraj stron i usług zawierających informacje poufne w tej samej przeglądarce, z której korzystasz do rozrywki. Poufne informacje najlepiej jest obsługiwać w środowisku izolowanym, na maszynie wirtualnej lub po prostu na oddzielnym urządzeniu.

Porady