Kilka dni temu pojawiła się wiadomość, że zidentyfikowano podatność w Netfilter (podsystem jądra Linux używany do filtrowania i modyfikowania pakietów sieciowych), który network umożliwia lokalnemu użytkownikowi uzyskanie uprawnień administratora w systemienawet w izolowanym pojemniku.
Luka CVE-2021-22555 jest to problem, który istnieje od jądra 2.6.19, uruchomiona 15 lat temu i jest spowodowane błędem w sterownikach IPT_SO_SET_REPLACE i IP6T_SO_SET_REPLACE, co powoduje przepełnienie bufora podczas wysyłania specjalnie zdobionych parametrów za pomocą wywołania setsockopt w trybie zgodności.
Być może wielu w tym momencie będzie się zastanawiać, jak to możliwe, że luka w jądrze Linuksa mogła pozostać niezauważona przez tak długi czas, a odpowiedzią na to jest to, że chociaż błąd, który był obecny od Linuksa 2.6.19, luka została wykryta przez kod audytu, mimo że kod C nie był odtwarzalny, więc nie można go było wykorzystać, ponieważ nie znaleziono wówczas niezbędnych zasobów do eskalacji uprawnień.
Na przykład wsparcie dla nieuprzywilejowanych przestrzeni nazw użytkowników jest w jądrze 3.8. Ponadto niektóre dystrybucje mają łatkę, która dodaje sysctl, aby wyłączyć nieuprzywilejowane przestrzenie nazw użytkowników.
W normalnych okolicznościach tylko użytkownik root może wywołać compat_setsockopt(), ale niezbędne uprawnienia wykonać atak może je również uzyskać nieuprzywilejowany użytkownik w systemach z włączonymi przestrzeniami nazw użytkowników.
CVE-2021-22555 to 15-letnia luka w zabezpieczeniach stosu podczas zapisu bez stosu w Linux Netfilter, która jest wystarczająco potężna, aby ominąć wszystkie współczesne zabezpieczenia i zapewnić wykonanie kodu jądra.
W związku z tym opisano, że lokalny użytkownik może utworzyć kontener z osobnym użytkownikiem root i stamtąd wykorzystać lukęi. Na przykład "przestrzenie nazw użytkowników" są domyślnie zawarte w Ubuntu i Fedorze, ale nie w Debianie i RHEL.
Tę lukę można wykorzystać poprzez częściowe nadpisanie
m_list->next
wskaźnikmsg_msg
struktury i uzyskania wolnego po użyciu. Jest to wystarczająco potężne, aby uruchomić kod jądra z pominięciem KASLR, SMAP i SMEP.
Problem pojawia się również 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ą.
W związku z tym jest o tym mowa błąd pozwala na zapisanie czterech „zerowych” bajtów w dowolnej pozycji poza buforem przypisane, ograniczone przez offset 0x4C. Z tego powodu wspomina się, że ta funkcja okazała się wystarczająca do stworzenia exploita co pozwala na uzyskanie uprawnień roota: usuwając m_list-> kolejny wskaźnik w strukturze msg_msg, tworzone były warunki dostępu do danych po zwolnieniu pamięci (use-after-free), które następnie służyły do uzyskiwania informacji o adresach i zmianach do innych struktur, manipulując wywołaniem systemowym msgsnd().
Jeśli chodzi o raport o błędach, jak każda wykryta luka, dotyczy to procesu i raportu, który został przekazany programistom jądra w kwietniu, a następnie został poprawiony w ciągu kilku dni oraz łatki, która jest zawarta we wszystkich obsługiwanych dystrybucjach, aby informacje o błędzie można opublikować później.
Projekty Debian, Arch Linux i Fedora wygenerowały już aktualizacje pakietów. Począwszy od Ubuntu trwają prace nad aktualizacjami RHEL i SUSE. Ponieważ błąd jest poważny, możliwy do wykorzystania w praktyce i pozwala na ucieczkę z kontenera, Google oszacował jego odkrycie na 10,000 XNUMX USD i podwoił nagrodę badaczowi, który zidentyfikował lukę w zabezpieczeniach oraz za zidentyfikowanie metody pozwalającej uniknąć izolacji kontenerów Kubernetes w klastrze kCTF.
Do testów przygotowano działający prototyp exploita który omija mechanizmy ochronne KASLR, SMAP i SMEP.
W końcu jeśli chcesz dowiedzieć się więcej na ten temat, możesz sprawdzić szczegóły W poniższym linku.