SWAPGS - nowa luka w mechanizmie wykonania spekulatywnego procesora

Naukowcy z Bitdefender ujawnił nowa luka (CVE-2019-1125) w spekulatywnym mechanizmie wykonywania instrukcji współczesnych procesorów, który nosi nazwę SWAPGS, co odpowiada nazwie instrukcji procesora powodującej problem. Słaby punkt pozwala on pozwolić nieuprzywilejowanemu atakującemu na określenie zawartości obszarów pamięci jądra lub działających maszyn wirtualnych. Problem Potwierdzony w procesorach Intel (x86_64) i częściowo ma wpływ Procesory AMD, dla których nie pojawia się główny wektor ataku. Wcześniej zaimplementowane metody przeciwdziałania podatnościom Spectre i Meltdown nie chronią przed atakiem SWAPGS podczas korzystania z procesorów Intel, ale zaproponowano już poprawki dla systemów Linux, ChromeOS, Android i Windows.

Luka należy do klasy Spectre v1 i opiera się na idei przywracania danych z pamięci podręcznej procesora pozostałej po spekulatywnym wykonaniu instrukcji. Aby poprawić wydajność, jednostki przewidywania rozgałęzień nowoczesnych procesorów korzystają z wywłaszczającego wykonywania niektórych instrukcji, które najprawdopodobniej zostaną wykonane, ale bez czekania na obliczenie wszystkich czynników determinujących ich wykonanie (na przykład, gdy warunki rozgałęzienia lub parametry dostępu nie zostały jeszcze obliczone). Jeśli przewidywanie nie zostanie potwierdzone, procesor odrzuca wynik wykonania spekulatywnego, ale dane przetworzone w jego trakcie pozostają w pamięci podręcznej procesora i można je przywrócić za pomocą metod określania zawartości pamięci podręcznej przez kanały boczne, analizując zmianę dostępu czas na dane buforowane i niebuforowane.

Osobliwością nowego ataku jest wykorzystanie wycieku, który ma miejsce podczas spekulatywnego wykonywania instrukcji SWAPGS, która jest wykorzystywana w systemach operacyjnych do zastąpienia wartości rejestru GS, gdy kontrola przechodzi z przestrzeni użytkownika do jądra systemu operacyjnego (GS wartość używana w przestrzeni użytkownika jest zastępowana wartością używaną podczas operacji w jądrze). W jądrze Linuksa GS przechowuje wskaźnik per_cpu używany do dostępu do danych jądra, a przestrzeń użytkownika przechowuje wskaźniki do TLS (Thread Local Storage).

Aby uniknąć dwukrotnego wywołania instrukcji SWAPGS podczas ponownego dostępu do jądra z przestrzeni jądra lub podczas wykonywania kodu, który nie wymaga zmiany rejestru GS, przed instrukcją wykonywane jest sprawdzenie i rozgałęzienie warunkowe. Silnik wykonywania spekulatywnego aktywnie przystępuje do wykonywania kodu za pomocą instrukcji SWAPGS, nie czekając na wynik sprawdzenia, a jeśli wybrana gałąź nie zostanie potwierdzona, odrzuca wynik. Może więc dojść do sytuacji, gdy spekulacyjnie wybrana zostanie gałąź nie obejmująca wykonania SWAPGS, lecz podczas wykonywania spekulatywnego wartość rejestru GS ​​zostanie zmieniona instrukcją SWAPGS i wykorzystana w zależnych operacjach pamięciowych, które trafiają do pamięci podręcznej procesora.

Badacze zaproponowali dwa scenariusze ataków, dla których przygotowano prototypy exploitów. Pierwszy scenariusz opiera się na sytuacji, w której instrukcja SWAPGS nie jest wykonywana spekulatywnie, choć faktycznie jest wykorzystywana w wykonaniu, natomiast drugi jest odwrotny, gdy instrukcja SWAPGS jest wykonywana spekulatywnie, chociaż w rzeczywistości nie powinna być wykonana. W każdym scenariuszu istnieją dwie możliwości wykorzystania: osoba atakująca może określić wartość pod określonym adresem w obszarze jądra, a osoba atakująca może wyszukać określoną wartość pod losowymi adresami w jądrze. Przeprowadzenie ataku zajmuje dużo czasu, a exploit może potrzebować kilku godzin, aby zakończyć wyciek.

Wystąpił problem z jądrem Linuksa wyłączony poprzez zmianę logiki wywoływania instrukcji SWAPGS (blokowanie wykonania spekulatywnego), na wzór korekty innych podatności klasy Spectre v1. Oczekuje się, że dodatkowa ochrona będzie miała minimalny wpływ na wydajność typowych obciążeń. Opóźnienie występuje podczas fazy przełączania między przestrzenią użytkownika a jądrem, co może skutkować słabą wydajnością, na przykład w przypadku intensywnego wywoływania systemu z aplikacji lub częstego generowania NMI i przerwań.

Poprawka wymaga zainstalowania aktualizacji jądra zarówno w systemie hosta, jak i w środowisku gościa, a następnie ponownego uruchomienia systemu. Aby wyłączyć ochronę w systemie Linux, można użyć opcji „nospectre_v1”, która również wyłącza mechanizmy blokujące lukę SWAPGS. Poprawka jest dostępna jako skrawek dla jądra Linuksa, które jest już zawarte w wydaniach 4.19.65, 5.2.7, 4.14.137, 4.9.188 i 4.4.188. Aktualizacje dla dystrybucji Linuksa nie zostały jeszcze wydane (Debian, RHEL, Fedora, Arch Linux, SUSE/openSUSE, Ubuntu). W systemie Windows problem został po cichu naprawiony Aktualizacja lipcowa. Firma Google przygotowany poprawka dla jądra 4.19 dostarczanego z ChromeOS i Android.

Według badaczy z Bitdefender, Intel został poinformowany o problemie już w sierpniu ubiegłego roku. Postanowiono rozwiązać problem programowo, w związku z czym w skoordynowane opracowanie poprawki zaangażowani byli programiści z Microsoft, Google i jądra Linuksa. Starsze procesory Intela, starsze niż Ivy Bridge, są znacznie trudniejsze do zaatakowania ze względu na brak obsługi instrukcji WRGSBASE użytej w exploitie. Problem nie dotyczy systemów ARM, POWER, SPARC, MIPS i RISC-V, ponieważ nie obsługują instrukcji SWAPGS.

Problem dotyka głównie właścicieli procesorów Intel -
Na układach AMD udało się odtworzyć jedynie drugi scenariusz ataku, który ogranicza się do spekulatywnego przetwarzania wartości bazowej rejestru GS, za pomocą której można szukać określonych wartości w obszarach pamięci losowej. Aby zablokować tę opcję ataku jest wystarczający istniejące metody ochrony przed Spectre v1.

Źródło: opennet.ru

Dodaj komentarz