Zidentyfikowano dwie nowe podatności w podsystemie eBPF, który pozwala na uruchamianie handlerów wewnątrz jądra Linux w specjalnej maszynie wirtualnej z JIT. Obie podatności umożliwiają wykonanie własnego kodu z uprawnieniami jądra, poza izolowaną maszyną wirtualną eBPF. Informacje o problemach opublikował zespół Zero Day Initiative, który organizuje zawody Pwn2Own, podczas których w tym roku zaprezentowano trzy ataki na Ubuntu Linux, wykorzystujące wcześniej nieznane podatności (nie podano, czy podatności w eBPF mają związek z tymi atakami).
- CVE-2021-3490 — podatność spowodowana brakiem weryfikacji przekroczenia granic 32-bitowych wartości podczas wykonywania operacji bitowych AND, OR i XOR w eBPF ALU32. Atakujący może wykorzystać ten błąd do odczytu i zapisu danych poza granicami przydzielonego bufora. Problem z operacją XOR występuje od wersji jądra 5.7-rc1, a AND i OR — od wydania 5.10-rc1.
- CVE-2021-3489 — podatność spowodowana błędem w implementacji bufora cyklicznego. Związana jest z tym, że funkcja bpf_ringbuf_reserve nie weryfikowała, czy rozmiar przydzielonego obszaru pamięci może być mniejszy od faktycznego rozmiaru bufora cyklicznego ringbuf. Problem występuje od wersji 5.8-rc1.
Status poprawek podatności w dystrybucjach można śledzić na stronach: Ubuntu, Debian, RHEL, Fedora, SUSE, Arch. Poprawki są również dostępne w postaci łatek (CVE-2021-3489, CVE-2021-3490). Możliwość wykorzystania problemu zależy od dostępności wywołania systemowego eBPF dla użytkownika. Na przykład w domyślnej konfiguracji w RHEL, aby wykorzystać podatność, użytkownik musi mieć uprawnienia CAP_SYS_ADMIN.
Osobno można wyróżnić jeszcze jedną podatność w jądrze Linux — CVE-2021-32606, która pozwala lokalnemu użytkownikowi podnieść swoje uprawnienia do poziomu root. Problem występuje od jądra Linux 5.11 i jest spowodowany stanem wyścigu w implementacji protokołu CAN ISOTP, co pozwala na zmianę parametrów przywiązywania do gniazda z powodu braku odpowiednich blokad w funkcji isotp_setsockopt() podczas przetwarzania flagi CAN_ISOTP_SF_BROADCAST.
Po zamknięciu gniazda ISOTP nadal obowiązuje powiązanie z gniazdem odbiorcy, który może kontynuować korzystanie z powiązanych struktur gniazda po zwolnieniu związanej z nimi pamięci (use-after-free z powodu odwołania się do już zwolnionej struktury isotp_sock w wywołaniu isotp_rcv()). Dzięki manipulacjom danymi można osiągnąć przedefiniowanie wskaźnika na funkcję sk_error_report() i wykonać swój kod na poziomie jądra.
Źródło: opennet.ru
