Retbleed to nowy atak na spekulacyjny mechanizm wykonawczy procesorów Intel i AMD

Grupa badaczy z ETH Zurich zidentyfikowała nowy atak na mechanizm spekulatywnego wykonywania przejść pośrednich w procesorze, który umożliwia wydobycie informacji z pamięci jądra lub zorganizowanie ataku na system hosta z maszyn wirtualnych. Luki mają nazwę kodową Retbleed (CVE-2022-29900, CVE-2022-29901) i swoim charakterem przypominają ataki Spectre-v2. Różnica sprowadza się do organizacji spekulatywnego wykonania dowolnego kodu podczas przetwarzania instrukcji „ret” (return), która pobiera adres do skoku ze stosu, zamiast pośredniego skoku za pomocą instrukcji „jmp”, ładując adres ze pamięć lub rejestr procesora.

Osoba atakująca może stworzyć warunki do nieprawidłowego przewidywania przejścia i zorganizować ukierunkowane, spekulatywne przejście do bloku kodu, którego nie przewiduje logika wykonania programu. Ostatecznie procesor stwierdzi, że przewidywanie rozgałęzienia nie było uzasadnione i cofnie operację do pierwotnego stanu, ale dane przetworzone podczas wykonywania spekulacyjnego wylądują w pamięci podręcznej i buforach mikroarchitektury. Jeśli błędnie wykonany blok uzyska dostęp do pamięci, wówczas jego spekulacyjne wykonanie doprowadzi do zapisania danych odczytanych z pamięci we współdzielonej pamięci podręcznej.

Aby określić, ile danych pozostaje w pamięci podręcznej po operacjach spekulacyjnych, osoba atakująca może zastosować techniki kanału bocznego w celu ustalenia pozostałych danych, takie jak analiza zmian w czasach dostępu do danych buforowanych i niezapisanych w pamięci podręcznej. Aby celowo wyodrębnić informacje z obszarów na innym poziomie uprawnień (na przykład z pamięci jądra), używane są „gadżety” - sekwencje poleceń obecnych w jądrze, które nadają się do spekulacyjnego odczytu danych z pamięci w zależności od warunków zewnętrznych, na które mogą mieć wpływ napastnik.

Aby zabezpieczyć się przed klasycznymi atakami klasy Spectre, które wykorzystują instrukcje skoku warunkowego i pośredniego, większość systemów operacyjnych wykorzystuje technikę „retpoline”, która polega na zastąpieniu operacji skoku pośredniego instrukcją „ret”, dla której procesory używają oddzielnej jednostki przewidywania stanu stosu . nieużywanie bloku przewidywania rozgałęzień. Kiedy w 2018 roku wprowadzono retpoline, uważano, że manipulacje adresami podobne do Spectre nie są praktyczne w przypadku rozgałęzień spekulatywnych przy użyciu instrukcji „ret”.

Badacze, którzy opracowali metodę ataku Retbleed, wykazali możliwość stworzenia warunków mikroarchitektonicznych do inicjowania spekulatywnego przejścia za pomocą instrukcji „ret” oraz opublikowali gotowe narzędzia do identyfikacji sekwencji instrukcji (gadżetów) odpowiednich do wykorzystania luki w jądrze Linuksa, w którym takie warunki się objawiają.

Podczas badań przygotowano działający exploit, który pozwala na systemach z procesorami Intel wyodrębnić dowolne dane z pamięci jądra z nieuprzywilejowanego procesu w przestrzeni użytkownika z szybkością 219 bajtów na sekundę i dokładnością 98%. Na procesorach AMD wydajność exploita jest znacznie wyższa – szybkość wycieku wynosi 3.9 KB na sekundę. Jako praktyczny przykład pokazujemy, jak wykorzystać proponowany exploit do ustalenia zawartości pliku /etc/shadow. Na systemach z procesorami Intel atak mający na celu ustalenie skrótu hasła użytkownika root został przeprowadzony w 28 minut, a na systemach z procesorami AMD - w 6 minut.

Atak został potwierdzony w przypadku procesorów Intel 6-8 generacji, które zostały wprowadzone na rynek przed trzecim kwartałem 3 r. (w tym Skylake) oraz procesorów AMD opartych na mikroarchitekturach Zen 2019, Zen 1+ i Zen 1, które zostały wprowadzone na rynek przed drugim kwartałem 2 r. W nowszych modelach procesorów takich jak AMD Zen2021 i Intel Alder Lake, a także w procesorach ARM problem jest blokowany przez istniejące mechanizmy zabezpieczające. Na przykład użycie instrukcji IBRS (Indirect Branch Restricted Speculation) pomaga chronić przed atakami.

Dla jądra Linuksa i hypervisora ​​Xen przygotowano zestaw zmian, które zablokują problem w oprogramowaniu na starszych procesorach. Proponowana łatka dla jądra Linuksa zmienia 68 plików, dodaje 1783 linie i usuwa 387 linii. Niestety ochrona prowadzi do znacznych kosztów ogólnych - w tekstach prowadzonych na temat procesorów AMD i Intel spadek wydajności szacuje się od 14% do 39%. Bardziej korzystne jest stosowanie ochrony opartej na instrukcjach IBRS, dostępnych w nowych generacjach procesorów Intel i obsługiwanych począwszy od jądra Linuksa 4.19.

W procesorach Intel podstawienie adresów dla spekulatywnego skoku pośredniego odbywa się dzięki funkcji, która pojawia się, gdy nastąpi przepełnienie dolnej granicy (niedopełnienie) w buforze stosu zwrotnego. Kiedy takie warunki wystąpią, instrukcja „ret” zaczyna stosować logikę wyboru adresu podobną do tej stosowanej przy normalnych skokach pośrednich. W jądrze Linuksa odnaleziono ponad tysiąc miejsc, które stwarzają warunki do zainicjowania takiego przepływu zwrotnego i są dostępne poprzez wywołania systemowe.

W procesorach AMD spekulatywne wykonanie instrukcji „ret” odbywa się bez odniesienia do bufora specyficznego dla stosu (stos adresów zwrotnych), a jednostka przewidywania rozgałęzień traktuje instrukcję „ret” nie jako powrót kontrolny, ale jako rozgałęzienie pośrednie i odpowiednio wykorzystuje dane do przewidywania przejść pośrednich. W tych warunkach można wykorzystać praktycznie każdą operację „ret” osiągalną poprzez wywołanie systemowe.

Dodatkowo w procesorach AMD zidentyfikowano także inny problem (CVE-2022-23825, Branch Type Confusion) związany z implementacją fikcyjnych rozgałęzień - warunki przewidywania rozgałęzień mogą wystąpić nawet bez niezbędnych instrukcji rozgałęzień, co pozwala wpływać na bufor przewidywania rozgałęzień bez instrukcji „ret”. Cecha ta znacznie komplikuje realizację zabezpieczenia i wymaga bardziej aktywnego czyszczenia bufora predykcji rozgałęzień. Oczekuje się, że dodanie pełnej ochrony do jądra zwiększy obciążenie o 209%.

Źródło: opennet.ru

Dodaj komentarz