Grupa badaczy z Wolnego Uniwersytetu Amsterdamu odkryła nową metodę ataku „Native BHI” (CVE-2024-2201), która umożliwia na systemach z procesorami Intel określenie zawartości pamięci jądra Linux podczas wykonywania exploita w przestrzeni użytkownika. W przypadku zastosowania ataku do systemów wirtualizacji, atakujący z systemu gościa może określić zawartość pamięci środowiska hosta lub innych systemów gości.
Metoda Native BHI oferuje inną technikę eksploatacji luki BHI (Branch History Injection, CVE-2022-0001), która omija wcześniej wdrożone środki ochrony. Proponowana w 2022 roku metoda ataku BHI zakładała eksploatację luki w ramach jednego poziomu uprawnień, w tym celu exploit opierał się na wykonaniu programu eBPF, załadowanego przez użytkownika w jądrze. Aby zablokować lukę, wystarczyło ograniczyć dostęp do wykonywania kodu eBPF dla zwykłych użytkowników.
Nowa metoda Native BHI nie wymaga dostępu do eBPF i pozwala na atak przez nieuprzywilejowanego użytkownika z przestrzeni użytkownika. Metoda opiera się na wykorzystywaniu istniejących w kodzie jądra gadgetów — sekwencji instrukcji prowadzących do spekulatywnego wykonania instrukcji. Aby znaleźć odpowiednie gadżety w jądrze, opracowano specjalne narzędzie InSpectre Gadget, które podczas analizy jądra 6.6-rc4 zidentyfikowało 1511 gadżetów Spectre i 2105 pomocniczych gadżetów dyspozycyjnych.

Na podstawie znalezionych gadżetów badacze przygotowali exploit, który umożliwia wydobycie z buforów jądra ciągu z hasłem użytkownika root, załadowanym z pliku /etc/shadow. Prędkość wydobywania danych z pamięci jądra wynosi około 3,5 KB na sekundę.

Metoda BHI jest rozszerzoną wersją ataku Spectre-v2, w której w celu ominięcia dodatkowej ochrony (Intel eIBRS i Arm CSV2) oraz zorganizowania wycieku danych wykorzystuje podstawianie wartości w buforze z globalną historią przejść (Branch History Buffer), stosowanym w CPU w celu zwiększenia dokładności przewidywania przejść dzięki uwzględnieniu historii poprzednich przejść. W trakcie ataku poprzez manipulacje z historią przejść tworzone są warunki do błędnego przewidywania przejścia i spekulatywnego wykonywania niezbędnych instrukcji, których wyniki osiedlają się w cache.
Różnice w ataku Spectre-v2 dotyczą użycia bufora historii przejść (Branch History Buffer) zamiast bufora przewidywania gałęzi (Branch Target Buffer). Aby wydobyć dane z pamięci, atakujący musi stworzyć warunki, w których podczas wykonywania operacji spekulacyjnej adres zostanie pobrany z obszaru, który należy określić. Po wykonaniu spekulacyjnego pośredniego przejścia, odczytany z pamięci adres przejścia pozostaje w cache, po czym jeden ze sposobów określenia zawartości cache może być zastosowany na podstawie analizy zmiany czasu dostępu do danych w cache i nie w cache.
Atak Native BHI nie jest chroniony przez zastosowanie instrukcji Intel IBT (Indirect Branch Tracking) oraz hybrydowego mechanizmu ochrony przepływu wykonania FineIBT, wdrożonego w jądrze Linux, który łączy zastosowanie sprzętowych instrukcji IBT i programowej ochrony kCFI (kernel Control Flow Integrity) w celu zablokowania naruszenia normalnej kolejności wykonania (control flow). FineIBT zezwala na wykonanie po pośrednim przejściu tylko w przypadku przejścia do instrukcji ENDBR, która umieszczana jest na samym początku funkcji. Dodatkowo (analogicznie do mechanizmu kCFI) następuje weryfikacja haszy, gwarantujących niezmienność wskaźników.
Aby chronić przed nowym wariantem ataku, w jądrze Linux dodano zmianę z implementacją dodatkowego trybu ochrony, stosującego proponowane przez firmę Intel sprzętowe środki ochrony (BHI_DIS_S) lub alternatywną programową ochronę, wdrożoną w celu ochrony hipernadzorcy. KVM. Twórcy hipernadzorcy Xen również wydali poprawkę, opartą na użyciu trybu BHI_DIS_S, ograniczającego przewidywania na podstawie historii przejść. Wsparcie dla BHI_DIS_S jest dostępne w procesorach począwszy od Intel Alder Lake, jak również w serwerowych CPU, począwszy od Intel Sapphire Rapids. Dostępny jest również programowy tryb ochrony, oparty na użyciu sekwencji do czyszczenia bufora historii przejść, jednak prowadzi to do bardziej zauważalnego spadku wydajności.
Źródło: opennet.ru
