Luka w podsystemie eBPF umożliwiająca wykonanie kodu na poziomie jądra Linuksa

Zidentyfikowano lukę (CVE-2021-4204) w podsystemie eBPF, która umożliwia uruchamianie procedur obsługi wewnątrz jądra Linuksa na specjalnej maszynie wirtualnej z JIT, co pozwala lokalnemu nieuprzywilejowanemu użytkownikowi osiągnąć eskalację uprawnień i wykonanie swojego kodu na poziomie jądra Linuksa. Problem pojawia się od czasu wydania jądra Linuksa 5.8 i pozostaje nierozwiązany (włącznie z wydaniem 5.16). Status generowania aktualizacji wraz z eliminacją problemu w dystrybucjach można śledzić na stronach: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch. Zapowiadane jest stworzenie działającego exploita, którego publikacja planowana jest na 18 stycznia (użytkownicy i programiści mają tydzień na naprawienie luki).

Podatność spowodowana jest błędnym sprawdzeniem programów eBPF przekazanych do wykonania. Podsystem eBPF udostępnia funkcje pomocnicze, których poprawność sprawdza specjalny weryfikator. Niektóre funkcje wymagają podania wartości PTR_TO_MEM jako argumentu i aby zapobiec możliwemu przepełnieniu bufora, weryfikator musi znać wielkość pamięci powiązanej z argumentem. W przypadku funkcji bpf_ringbuf_submit i bpf_ringbuf_discard dane o wielkości przesyłanej pamięci nie były raportowane do weryfikatora, co mogło zostać wykorzystane do nadpisania obszarów pamięci poza granicami bufora podczas wykonywania specjalnie spreparowanego kodu eBPF.

Aby przeprowadzić atak, użytkownik musi mieć możliwość załadowania swojego programu BPF, a wiele ostatnich dystrybucji Linuksa domyślnie to blokuje (w tym nieuprzywilejowany dostęp do eBPF jest teraz domyślnie zabroniony w samym jądrze, począwszy od wydania 5.16). Na przykład lukę można wykorzystać w domyślnej konfiguracji systemu Ubuntu 20.04 LTS, ale w środowiskach Ubuntu 22.04-dev, Debian 11, openSUSE 15.3, RHEL 8.5, SUSE 15-SP4 i Fedora 33 pojawia się ona tylko wtedy, gdy administrator ustaw kernel.unprivileged_bpf_disabled na 0. Aby obejść tę lukę, możesz wyłączyć wykonywanie programów BPF przez nieuprzywilejowanych użytkowników za pomocą polecenia „sysctl -w kernel.unprivileged_bpf_disabled=1”.

Źródło: opennet.ru

Dodaj komentarz