Luki w podsystemie eBPF jądra Linux

W podsystemie eBPF zidentyfikowano lukę (CVE-2021-29154), która pozwala na uruchomienie procedur obsługi śledzenia, analizowania działania podsystemów i zarządzania ruchem, wykonywanych wewnątrz jądra Linuksa na specjalnej maszynie wirtualnej z JIT, co pozwala na użytkownik lokalny, aby uzyskać wykonanie swojego kodu na poziomie jądra. Problem pojawia się do wydania 5.11.12 (włącznie) i nie został jeszcze naprawiony w dystrybucjach (Debian, Ubuntu, RHEL, Fedora, SUSE, Arch). Poprawka jest dostępna w formie łatki.

Według badaczy, którzy zidentyfikowali lukę, udało im się opracować działający prototyp exploita dla 32- i 64-bitowych systemów x86, z którego może skorzystać nieuprzywilejowany użytkownik. Jednak Red Hat zauważa, że ​​powaga problemu zależy od tego, czy wywołanie systemowe eBPF jest dostępne dla użytkownika. Na przykład w RHEL i większości innych dystrybucji Linuksa w domyślnej konfiguracji lukę można wykorzystać, jeśli włączono BPF JIT, a użytkownik ma uprawnienia CAP_SYS_ADMIN. W ramach obejścia zaleca się wyłączenie BPF JIT za pomocą polecenia: echo 0 > /proc/sys/net/core/bpf_jit_enable

Problem jest spowodowany błędem w obliczaniu przesunięcia dla instrukcji rozgałęzień podczas procesu generowania kodu maszynowego kompilatora JIT. W szczególności przy generowaniu instrukcji rozgałęzień nie bierze się pod uwagę, że offset może ulec zmianie po przejściu etapu optymalizacji. Lukę tę można wykorzystać do wygenerowania nietypowego kodu maszynowego i wykonania go na poziomie jądra.

Warto zaznaczyć, że nie jest to jedyna luka w podsystemie eBPF w ostatnim czasie. Pod koniec marca w jądrze zidentyfikowano dwie kolejne luki (CVE-2020-27170, CVE-2020-27171), dzięki którym możliwe jest wykorzystanie eBPF do ominięcia ochrony przed podatnościami klasy Spectre, które pozwalają określić zawartość pamięci jądra w wyniku stworzenia warunków do spekulacyjnej realizacji określonych operacji. Atak Spectre wymaga obecności określonej sekwencji poleceń w kodzie uprzywilejowanym, która prowadzi do spekulatywnego wykonania instrukcji. W eBPF znaleziono kilka sposobów generowania takich instrukcji poprzez manipulację programami BPF przesyłanymi do wykonania.

Luka CVE-2020-27170 jest spowodowana manipulacją wskaźnikiem w weryfikatorze BPF, co powoduje, że operacje spekulacyjne uzyskują dostęp do obszaru poza granicami bufora. Luka CVE-2020-27171 wynika z błędu niedopełnienia liczby całkowitej podczas pracy ze wskaźnikami, co prowadzi do spekulacyjnego dostępu do danych poza buforem. Problemy te zostały już naprawione w wersjach jądra 5.11.8, 5.10.25, 5.4.107, 4.19.182 i 4.14.227, a także zostały uwzględnione w aktualizacjach jądra większości dystrybucji Linuksa. Badacze przygotowali prototypowy exploit, który pozwala nieuprzywilejowanemu użytkownikowi na wydobycie danych z pamięci jądra.

Źródło: opennet.ru

Dodaj komentarz