Luki w podsystemie eBPF umożliwiające ominięcie ochrony przed atakami Spectre

W jądrze Linuksa (CVE-2021-33624) zidentyfikowano podatność pozwalającą na wykorzystanie podsystemu eBPF do ominięcia zabezpieczeń przed podatnościami klasy Spectre, które umożliwiają określenie zawartości pamięci w wyniku stworzenia warunków dla spekulacyjne wykonanie określonych operacji. Atak Spectre wymaga obecności określonej sekwencji poleceń w kodzie uprzywilejowanym, która prowadzi do spekulatywnego wykonania instrukcji. Manipulując programami BPF przesyłanymi do wykonania, możliwe jest generowanie podobnych instrukcji w eBPF i wyciekanie zawartości pamięci jądra i dowolnych obszarów pamięci fizycznej przez kanały boczne.

Podatność wynika z wad weryfikatora, który służy do wykrywania błędów i niedopuszczalnych działań w programach BPF. Weryfikator wylicza możliwe ścieżki wykonania kodu, pomija jednak opcje rozgałęzień, które są nieakceptowalne z punktu widzenia semantyki architektury zestawu instrukcji. Podczas wykonywania programu BPF takie opcje rozgałęzień, które nie zostaną uwzględnione przez weryfikator, mogą zostać błędnie przewidziane przez procesor i wykonane w trybie spekulatywnym. Przykładowo weryfikator analizując operację „load” spodziewa się, że instrukcja korzysta z rejestru o adresie, którego wartość zawsze mieści się w określonych granicach, jednak atakujący może stworzyć warunki, w których procesor będzie próbował spekulacyjnie wykonać operację z adres nie spełniający warunków weryfikacji.

Problem pojawia się od wydania jądra 4.15 i został naprawiony w postaci poprawek (1, 2, 3, 4). Luka pozostaje nienaprawiona w dystrybucjach (Debian, RHEL, Ubuntu, Fedora, SUSE, Arch).

Dodatkowo możesz zwrócić uwagę na uwagę dotyczącą wpływu na wydajność narzędzi chroniących przed podatnościami Spectre. Notatka podsumowuje wyniki optymalizacji debuggera rr (Record and Replay), który kiedyś powstał w Mozilli w celu debugowania trudnych do powtórzenia błędów w Firefoksie. Buforowanie wywołań systemowych używanych do sprawdzania istnienia katalogów skróciło operację „rr source” w projekcie testowym z 3 minut 19 sekund do 36 sekund.

Autor optymalizacji postanowił sprawdzić jak zmieni się wydajność po wyłączeniu ochrony Spectre. Po załadowaniu systemu parametrem „mitigations=off” czas wykonania „źródeł rr” bez optymalizacji wyniósł 2 minuty 5 sekund (1.6 razy szybciej), a po optymalizacji wyniósł 33 sekundy (9% szybciej). Co ciekawe, wyłączenie ochrony Spectre nie tylko skróciło czas wykonania kodu na poziomie jądra o 1.4 razy (z 2 m9 s do 1 m 32 s), ale także skróciło o połowę czas wykonania w przestrzeni użytkownika (z 1 m 9 s do 0 m 33 s), prawdopodobnie z powodu zmniejszonej wydajności działania pamięci podręcznej procesora i TLB resetuje się, gdy włączona jest ochrona przed widmem.

Źródło: opennet.ru

Dodaj komentarz