W Netfilter, systemie jądra Linux używanym do filtrowania i modyfikacji pakietów sieciowych, zidentyfikowano lukę (CVE-2021-22555), która umożliwia lokalnemu użytkownikowi uzyskanie uprawnień root w systemie, nawet znajdując się w izolowanym kontenerze. Przygotowano działający prototyp exploita, który omija mechanizmy ochrony KASLR, SMAP i SMEP. Badacz, który odkrył lukę, otrzymał od Google nagrodę w wysokości 20 tysięcy dolarów za opracowanie metody bypassu izolacji kontenerów Kubernetes w klastrze kCTF.
Problem występuje od jądra 2.6.19, wydanego 15 lat temu, i jest spowodowany błędem w obsłudze IPT_SO_SET_REPLACE i IP6T_SO_SET_REPLACE, który prowadzi do przepełnienia bufora podczas wysyłania specjalnie sformatowanych parametrów przez wywołanie setsockopt w trybie compat. Zwykle wywołanie compat_setsockopt() może wykonać tylko użytkownik root, jednak uprawnienia niezbędne do przeprowadzenia ataku mogą być również uzyskane przez użytkownika bez uprawnień w systemach z włączoną obsługą przestrzeni nazw identyfikatorów użytkowników (user namespaces).
Użytkownik może utworzyć kontener z osobnym użytkownikiem root i z niego wykorzystać lukę. Na przykład „user namespaces” jest domyślnie włączony w Ubuntu i Fedory, ale nie jest aktywowany w Debianie i RHEL. Poprawka naprawiająca lukę została przyjęta do jądra Linux 13 kwietnia. Aktualizacje pakietów zostały już opracowane przez projekty Debian, Arch Linux i Fedora. W Ubuntu, RHEL i SUSE aktualizacje są w trakcie przygotowania.
Problem występuje w funkcji xt_compat_target_from_user() z powodu nieprawidłowego obliczenia rozmiaru pamięci podczas zachowywania struktur jądra po konwersji z 32-bitowego na 64-bitowe przedstawienie. Błąd pozwala na zapisanie czterech zerowych bajtów w dowolnej pozycji poza przydzielonym buforem, ograniczoną przesunięciem 0x4C. Taka możliwość okazała się wystarczająca do stworzenia exploita, który umożliwia uzyskanie praw root – poprzez wyczyszczenie wskaźnika m_list->next w strukturze msg_msg stworzono warunki do dostępu do danych po zwolnieniu pamięci (use-after-free), co następnie wykorzystano do pozyskania informacji o adresach i zmiany innych struktur przez manipulację z wywołaniem systemowym msgsnd().
Źródło: opennet.ru
