Luka w podsystemie jądra Linux Netfilter

W Netfilter, podsystemie jądra Linuksa służącym do filtrowania i modyfikowania pakietów sieciowych, wykryto lukę (CVE-2021-22555), która umożliwia użytkownikowi lokalnemu uzyskanie uprawnień roota w systemie, także w izolowanym kontenerze. Do testów przygotowano działający prototyp exploita omijającego mechanizmy zabezpieczające KASLR, SMAP i SMEP. Badacz, który odkrył lukę, otrzymał od Google nagrodę w wysokości 20 XNUMX dolarów za znalezienie metody na ominięcie 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 procedurach obsługi IPT_SO_SET_REPLACE i IP6T_SO_SET_REPLACE, który powoduje przepełnienie bufora podczas wysyłania specjalnie sformatowanych parametrów poprzez wywołanie setsockopt w trybie zgodności. W normalnych okolicznościach tylko użytkownik root może wywołać funkcję compat_setsockopt(), ale uprawnienia wymagane do przeprowadzenia ataku może uzyskać także użytkownik nieuprzywilejowany w systemach z włączoną obsługą przestrzeni nazw użytkowników.

Użytkownik może utworzyć kontener z oddzielnym użytkownikiem root i stamtąd wykorzystać lukę. Na przykład „przestrzenie nazw użytkowników” są domyślnie włączone w Ubuntu i Fedorze, ale nie są włączone w Debianie i RHEL. Łatka naprawiająca lukę została zaadoptowana do jądra Linuksa 13 kwietnia. Aktualizacje pakietów zostały już wygenerowane przez projekty Debian, Arch Linux i Fedora. W Ubuntu, RHEL i SUSE aktualizacje są w przygotowaniu.

Problem występuje w funkcji xt_compat_target_from_user() z powodu nieprawidłowego obliczenia rozmiaru pamięci podczas zapisywania struktur jądra po konwersji z reprezentacji 32-bitowej na 64-bitową. Błąd umożliwia zapisanie czterech bajtów zerowych w dowolnej pozycji poza przydzielonym buforem ograniczonym przesunięciem 0x4C. Cecha ta okazała się wystarczająca do stworzenia exploita pozwalającego na uzyskanie praw roota - poprzez wyczyszczenie wskaźnika m_list->next w strukturze msg_msg stworzono warunki dostępu do danych po zwolnieniu pamięci (use-after-free), co została następnie wykorzystana do uzyskania informacji o adresach i zmianach w innych strukturach poprzez manipulację wywołaniem systemowym msgsnd().

Źródło: opennet.ru

Dodaj komentarz