Grupa badawcza z ETH Zurich odkryła nową metodę ataku na mechanizm spekulacyjnego wykonywania przejść pośrednich w procesorze, umożliwiającą wyciąganie informacji z pamięci jądra lub przeprowadzenie ataku na system hosta z wirtualnych maszyn. Wrażliwości otrzymały nazwę kodową Retbleed (CVE-2022-29900, CVE-2022-29901) i są zbliżone do ataków Spectre-v2. Różnica polega na organizacji spekulacyjnego wykonywania dowolnego kodu podczas przetwarzania instrukcji „ret” (return), która wyciąga adres przejścia ze stosu, zamiast używać instrukcji „jmp” do załadowania adresu z pamięci lub rejestru CPU.
Atakujący może stworzyć warunki do błędnego przewidywania przejścia i zorganizować celowe spekulacyjne przejście do bloku kodu, który nie jest przewidziany w logice wykonywania programu. Ostatecznie procesor ustali, że przewidywanie rozgałęzienia się nie powiodło i cofnę operację do pierwotnego stanu, jednak dane przetwarzane podczas spekulacyjnego wykonywania pozostaną w pamięci podręcznej i buforach mikroarchitektury. Jeśli błędnie wykonany blok uzyskuje dostęp do pamięci, jego spekulacyjne wykonywanie doprowadzi do osadzenia w ogólnej pamięci podręcznej i danych odczytanych z pamięci.
Aby zidentyfikować dane, które pozostały w pamięci podręcznej po spekulacyjnym wykonywaniu operacji, atakujący może wykorzystywać metody określania pozostałych danych za pomocą bocznych kanałów, na przykład analizując zmiany czasu dostępu do danych z pamięci podręcznej i nieprzechowywanych w pamięci. Do celowego wyciągania informacji z obszarów na innym poziomie uprawnień (na przykład z pamięci jądra) wykorzystywane są „gadżety” — sekwencje instrukcji obecne w jądrze, odpowiednie do spekulacyjnego odczytu danych z pamięci w zależności od warunków zewnętrznych, na które może mieć wpływ atakujący.
Aby chronić przed klasycznymi atakami Spectre, które wykorzystują instrukcje warunkowego i pośredniego skoku, w większości systemów operacyjnych stosuje się technikę "retpoline", która polega na zastępowaniu operacji pośredniego skoku instrukcją "ret". Dla tej ostatniej w procesorach stosowany jest osobny blok przewidywania stanu stosu, który nie korzysta z bloku przewidywania skoków. W momencie wprowadzania retpoline w 2018 roku uznano, że manipulacje adresowe podobne do Spectre nie mają praktycznego zastosowania w spekulatywnych skokach przy użyciu instrukcji "ret".
Badacze, którzy opracowali metodę ataku Retbleed, wykazali możliwość stworzenia warunków mikroarchitektonicznych do inicjacji spekulatywnego skoku za pomocą instrukcji "ret" i opublikowali gotowe narzędzia do wykrywania w jądrze Linux sekwencji instrukcji (gadżetów), które są podatne na exploity związane z tymi warunkami.
W trakcie badań przygotowano działający exploit, który na systemach z procesorami Intel umożliwia z nieprzywilejowanego procesu w przestrzeni użytkownika wyciąganie dowolnych danych z pamięci jądra z prędkością 219 bajtów na sekundę i dokładnością 98%. Na procesorach AMD skuteczność exploita jest znacznie wyższa — prędkość wycieku wynosi 3,9 kB na sekundę. Jako praktyczny przykład pokazano, jak za pomocą proponowanego exploita określić zawartość pliku /etc/shadow. Na systemach z procesorami Intel atak na określenie hasha hasła użytkownika root został przeprowadzony w ciągu 28 minut, a na systemach z procesorami AMD — w ciągu 6 minut.

Możliwość przeprowadzenia ataku została potwierdzona dla procesorów Intel 6-8 generacji, produkowanych do trzeciego kwartału 2019 roku (w tym Skylake), oraz procesorów AMD opartych na mikroarchitekturze Zen 1, Zen 1+ i Zen 2, produkowanych do drugiego kwartału 2021 roku. W nowszych modelach procesorów, takich jak AMD Zen3 i Intel Alder Lake, a także w procesorach ARM, problem jest blokowany przez istniejące mechanizmy ochrony. Na przykład zastosowanie instrukcji IBRS (Indirect Branch Restricted Speculation) pomaga chronić przed atakiem.
Dla jądra Linux i hyperwizora Xen przygotowano zestaw zmian, które na starszych procesorach rozwiązują problem programowo. Proponowana łatka dla jądra Linux zmienia 68 plików, dodaje 1783 wiersze i usuwa 387 wierszy. Niestety, zabezpieczenie wiąże się z znacznymi kosztami overhead — w przeprowadzonych testach na procesorach AMD i Intel spadek wydajności szacuje się na 14% do 39%. Lepiej jest zastosować ochronę opartą na instrukcjach IBRS, dostępnych w nowych generacjach procesorów Intel i wspieranych od jądra Linux 4.19.
Na procesorach Intel podstawienie adresu dla spekulatywnego pośredniego przejścia realizowane jest dzięki cechom, które ujawniają się podczas przepełnienia przez dolną granicę (underflow) w buforze przewidywania zwrotu (Return Stack Buffer). W takich warunkach dla instrukcji "ret" zaczyna być stosowana logika wyboru adresu, podobna do tej używanej w przypadku zwykłych przejść pośrednich. W jądrze Linux znaleziono ponad tysiąc miejsc, które tworzą warunki do inicjacji podobnego odwrotnego przepełnienia i są dostępne poprzez wywołania systemowe.
Na procesorach AMD spekulacyjne wykonanie instrukcji "ret" odbywa się bez powiązania ze specyficznym dla stosu buforem adresów zwrotu (Return Address Stack), a blok przewidywania przejść traktuje instrukcję "ret" nie jako zwrot kontroli, lecz jako przejście pośrednie, i odpowiednio wykorzystuje dane do przewidywań przejść pośrednich. W takich warunkach de facto każda operacja "ret", osiągalna przez wywołanie systemowe, może być wykorzystana do ataku.
Dodatkowo w procesorach AMD zidentyfikowano kolejny problem (CVE-2022-23825, Branch Type Confusion), związany z realizacją fikcyjnych przejść — warunki do przewidywania przejścia mogą występować nawet bez niezbędnych instrukcji sterujących, co pozwala wpływać na bufor przewidywania przejść bez instrukcji "ret". Ta cecha znacznie utrudnia implementację zabezpieczeń i wymaga bardziej aktywnego czyszczenia bufora przewidywania przejść. Oczekuje się, że dodanie pełnych zabezpieczeń do jądra prowadzić będzie do wzrostu kosztów overhead o 209%.
Źródło: opennet.ru
