W podsystemie eBPF, który umożliwia uruchamianie handlerów do śledzenia, analizy działania podsystemów i zarządzania ruchem, wykonywanych wewnątrz jądra Linux w specjalnej maszynie wirtualnej z JIT, wykryto podatność (CVE-2021-29154), pozwalającą lokalnemu użytkownikowi na wykonanie swojego kodu na poziomie jądra. Problem występuje do wersji 5.11.12 (włącznie) i nie został jeszcze naprawiony w dystrybucjach (Debian, Ubuntu, RHEL, Fedora, SUSE, Arch). Poprawka jest dostępna w postaci łatki.
Według badaczy, którzy zidentyfikowali tę podatność, udało im się opracować działający prototyp exploitacji dla systemów 32- i 64-bitowych x86, który może być użyty przez użytkownika bez uprawnień. Firma Red Hat zauważa, że niebezpieczeństwo problemu zależy od dostępności wywołania systemowego eBPF dla użytkownika. Na przykład w RHEL i większości innych dystrybucji Linux w konfiguracji domyślnej podatność może być wykorzystywana przy włączonym BPF JIT i posiadaniu przez użytkownika uprawnień CAP_SYS_ADMIN. Jako środek zaradczy zaleca się wyłączenie BPF JIT za pomocą polecenia: echo 0 > /proc/sys/net/core/bpf_jit_enable
Problem jest spowodowany błędem obliczania przesunięcia dla instrukcji skokowych podczas generowania kodu maszynowego przez kompilator JIT. W szczególności podczas generowania instrukcji skokowych nie uwzględnia się, że przesunięcie może się zmienić po etapie optymalizacji. Wskazana niedoróbka może być wykorzystywana do formowania nienormalnego kodu maszynowego i jego wykonania na poziomie jądra.
Warto zaznaczyć, że to niejedyna podatność w podsystemie eBPF w ostatnim czasie. Pod koniec marca w jądrze wykryto jeszcze dwie podatności (CVE-2020-27170, CVE-2020-27171), które umożliwiają wykorzystanie eBPF do obejścia ochrony przed podatnościami typu Spectre, pozwalającymi na określenie zawartości pamięci jądra w wyniku stworzenia warunków do spekulatywnego wykonania określonych operacji. Do ataku typu Spectre wymagana jest obecność w privilegowanym kodzie określonej sekwencji instrukcji, prowadzących do spekulatywnego wykonania instrukcji. W eBPF znaleziono kilka sposobów generowania takich instrukcji poprzez manipulacje przekazywanymi do wykonania programami BPF.
Luka CVE-2020-27170 wynika z manipulacji wskaźnikami w weryfikatorze BPF, które prowadzą do spekulacyjnych operacji odwołań do obszaru poza granicą bufora. Luke CVE-2020-27171 związana jest z błędem arytmetyki całkowitej (integer underflow) podczas pracy z wskaźnikami, co prowadzi do spekulacyjnego dostępu do danych poza buforem. Wskazane problemy 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 znalazły się w aktualizacjach jądra większości dystrybucji Linux. Badacze opracowali prototyp exploita, który pozwala nieuprzywilejowanemu użytkownikowi na wydobycie danych z pamięci jądra.
Źródło: opennet.ru
