Grupa badaczy z kilku amerykańskich, izraelskich i australijskich uniwersytetów opracowała trzy działające w przeglądarkach internetowych ataki mające na celu wydobycie informacji o zawartości cache procesora. Jedna z metod działa w przeglądarkach bez JavaScript, a pozostałe dwie omijają istniejące metody ochrony przed atakami kanałów bocznych, w tym stosowane w przeglądarkach Tor i DeterFox. Kod do demonstracji ataków oraz niezbędne komponenty serwerowe do ataków zostały opublikowane na GitHubie.
Do analizy zawartości cache we wszystkich atakach stosowana jest metoda Prime+Probe, która polega na wypełnieniu cache zestawem wzorcowych wartości i określaniu zmian poprzez mierzenie czasu dostępu do nich podczas ponownego wypełnienia. Aby obejść mechanizmy ochrony obecne w przeglądarkach, które uniemożliwiają dokładne pomiary czasu, w dwóch wariantach następuje odwołanie do kontrolowanego przez atakującego serwera DNS lub WebSocket, na którym prowadzony jest log czasów przybycia zapytań. W jednym z wariantów stały czas odpowiedzi DNS jest używany jako punkt odniesienia czasu.
Pomiarów przeprowadzonych z wykorzystaniem zewnętrznych serwerów DNS lub WebSocket, dzięki zastosowaniu systemu klasyfikacji opartego na uczeniu maszynowym, okazało się wystarczające do przewidywania wartości z dokładnością do 98% w najbardziej optymalnym scenariuszu (średnio 80-90%). Metody ataku przetestowane na różnych platformach sprzętowych (Intel, AMD Ryzen, Apple M1, Samsung Exynos) wykazały się uniwersalnością.

W pierwszym wariancie ataku 'DNS Racing' stosowana jest klasyczna implementacja metody Prime+Probe, która korzysta z tablic JavaScript. Różnice dotyczą zastosowania zewnętrznego timera opartego na DNS oraz obsługi zdarzenia onerror, która uruchamia się przy próbie załadowania obrazu z nieistniejącej domeny. Zewnętrzny timer umożliwia przeprowadzenie ataku Prime+Probe w przeglądarkach, które ograniczają lub całkowicie wyłączają dostęp do timerów JavaScript.
Dla serwera DNS, umieszczonego w tej samej sieci Ethernet, dokładność timera szacuje się na około 2 ms, co jest wystarczające do przeprowadzenia ataku za pośrednictwem zewnętrznych kanałów (dla porównania, dokładność standardowego timera JavaScript w przeglądarce Tor została obniżona do 100 ms). Do ataku nie jest wymagane kontrolowanie serwera DNS, ponieważ czas wykonania operacji jest dobierany tak, aby czas odpowiedzi z DNS służył jako wskaźnik wcześniejszego zakończenia sprawdzania (w zależności od tego, czy wcześniej czy później zadziałał handler onerror, wyciąga się wniosek o szybkości wykonania operacji sprawdzającej z pamięcią podręczną).
Druga metoda ataku „String and Sock” ma na celu obejście metod ochrony, które ograniczają niskopoziomowe wykorzystanie tablic w JavaScript. Zamiast tablic w „String and Sock” stosuje się operacje na bardzo dużych łańcuchach, których rozmiar jest dobierany tak, aby zmienna pokrywała cały cache LLC (Last level cache). Następnie za pomocą funkcji indexOf() w łańcuchu wyszukiwany jest mały podłańcuch, który początkowo nie występuje w oryginalnym łańcuchu, tzn. operacja wyszukiwania prowadzi do przeszukiwania całego łańcucha. Ponieważ rozmiar łańcucha odpowiada rozmiarowi cache'a LLC, skanowanie umożliwia przeprowadzenie operacji sprawdzania cache'a bez manipulacji tablicami. W celu pomiaru opóźnień zamiast DNS wykorzystywane jest połączenie z kontrolowanym przez atakującego serwerem WebSocket — przed rozpoczęciem i po zakończeniu operacji wyszukiwania w łańcuchu wysyłane są zapytania, na podstawie których serwerze oblicza się opóźnienie, które jest wykorzystywane do analizy zawartości pamięci podręcznej.
Trzecia metoda ataku „CSS PP0” została zrealizowana za pomocą HTML i CSS i może działać w przeglądarkach z wyłączonym JavaScript. Metoda przypomina „String and Sock”, ale nie jest związana z JavaScript. Podczas ataku tworzy się zestaw selektorów CSS, które realizują wyszukiwanie według maski. Początkowy duży ciąg, wypełniający pamięć podręczną, jest definiowany przez stworzenie tagu div z bardzo długą nazwą klasy. Wewnątrz umieszczany jest zestaw innych div-ów z własnymi identyfikatorami. Dla każdego z tych zagnieżdżonych div-ów określany jest własny styl z selektorem, realizującym wyszukiwanie podciągu. Podczas rysowania strony przeglądarka najpierw próbuje przetworzyć wewnętrzne div-y, co prowadzi do realizacji operacji wyszukiwania w dużym ciągu. Wyszukiwanie odbywa się według z góry nieobecnej maski i prowadzi do przeszukiwania całego ciągu, po czym aktywowane zostaje warunki „not” i następuje próba załadowania obrazu tła, odwołującego się do losowego domeny: <style> #pp:not([class*=’xjtoxg’]) #s0 {background-image: url(«https://qdlvibmr.helldomain.oy.ne.ro»);} #pp:not([class*=’gzstxf’]) #s1 {background-image: url(«https://licfsdju.helldomain.oy.ne.ro»);} … </style> <div id="»pp»" class="»строка," размером около мегабайта»> <div id="»s0″">X</div> <div id="»s1″">X</div> … </div>
Subdomeny są obsługiwane na serwerze DNS atakującego, który może mierzyć opóźnienia w otrzymywaniu zapytań. Na wszystkie zapytania serwer DNS zwraca NXDOMAIN i prowadzi log dokładnego czasu zgłoszeń. W wyniku przetwarzania zestawu div-ów do serwera DNS atakującego trafia seria zapytań, których opóźnienia korelują z wynikiem sprawdzania zawartości pamięci podręcznej.

Źródło: opennet.ru
