Kilka dni temu pojawiła się wiadomość, że zidentyfikowano lukę (już skatalogowany pod CVE-2022-0185) in kontekstowe API systemu plików dostarczone przez jądro Linuksa co może pozwolić użytkownikowi lokalnemu na uzyskanie uprawnień administratora w systemie.
Wspomina się, że problem polega na tym, że nieuprzywilejowany użytkownik może uzyskać takie uprawnienia w izolowanym kontenerze czy obsługa przestrzeni nazw użytkowników jest włączona w systemie.
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 (chyba że są używane platformy izolacji kontenerów). Oprócz eskalacji uprawnień luka może również zostać wykorzystana do wydostania się z izolowanego kontenera, jeśli kontener ma uprawnienie CAP_SYS_ADMIN.
Słaby punkt istnieje w funkcji legacy_parse_param() w VFS i wynika to z braku właściwej walidacji maksymalnego rozmiaru dostarczanych parametrów w systemach plików, które nie obsługują kontekstowego API systemu plików.
Ostatnio kilku znajomych z mojego zespołu CTF Crusaders of Rust i ja napotkaliśmy przepełnienie sterty jądra Linuksa zerowego dnia. Znaleźliśmy błąd poprzez fuzzing z syzkallerem i szybko przekształciliśmy go w exploita Ubuntu LPE. Następnie przepisaliśmy go od nowa, aby uciec i zrootować zahartowaną infrastrukturę Kubernetes CTF firmy Google. Ten błąd dotyczy wszystkich wersji jądra od 0 (obecnie 5.1 jest w toku) i został przypisany CVE-5.16-2022. Zgłosiliśmy to już na liście dystrybucyjnej Linuksa i na liście dyskusyjnej dotyczącej bezpieczeństwa, a błąd został naprawiony wraz z wydaniem tego artykułu.
Przekazanie zbyt dużego parametru może spowodować przepełnienie zmiennej całkowitej używanej do obliczania rozmiaru zapisywanych danych; kod ma sprawdzanie przepełnienia bufora "if (len > PAGE_SIZE - 2 - rozmiar)", które nie działa, jeśli wartość rozmiaru jest większa niż 4094 z powodu przepełnienia liczby całkowitej przez dolną granicę (przepełnienie liczby całkowitej, przy konwersji 4096 – 2 – 4095 do unsigned int, otrzymuje 2147483648).
Ten błąd umożliwia dostęp do specjalnie spreparowanego obrazu FS, spowodować przepełnienie bufora i nadpisać dane jądra za przydzielonym obszarem pamięci. Do wykorzystania luki wymagane są uprawnienia CAP_SYS_ADMIN, czyli uprawnienia administratora.
Od 2022 r. nasi koledzy z zespołu postanowili znaleźć dzień 0 w 2022 r. Nie byliśmy do końca pewni, jak zacząć, ale ponieważ nasz zespół dobrze znał luki w jądrze Linuksa, postanowiliśmy po prostu kupić kilka serwerów dedykowanych. i uruchom syzkaller fuzzer firmy Google. 6 stycznia o 22:30 czasu PST chop0 otrzymał następujący raport o awarii KASAN w legacy_parse_param: slab-out-of-bounds Napisz w legacy_parse_param. Wygląda na to, że syzbot znalazł ten problem dopiero 6 dni wcześniej podczas fuzzingu Androida, ale problem nie został rozwiązany i naiwnie sądziliśmy, że nikt inny tego nie zauważył.
Na koniec warto wspomnieć, że problem pojawił się od wersji jądra Linux 5.1 i został rozwiązany w aktualizacjach wydanych kilka dni temu w wersjach 5.16.2, 5.15.16, 5.10.93, 5.4.173.
poza tym Aktualizacje pakietów luk zostały już wydane dla RHEL, Debian, fedora i Ubuntu. Chociaż rozwiązanie nie jest jeszcze dostępne w Arch Linux, Gentoo, SUSE y otwórzSUSE.
W ich przypadku wspomniano, że jako rozwiązanie zabezpieczające dla systemów, które nie używają izolacji kontenerów, można ustawić wartość sysctl „user.max_user_namespaces” na 0:
Badacz, który zidentyfikował problem, opublikował demo exploita que umożliwia uruchamianie kodu jako root na Ubuntu 20.04 w domyślnej konfiguracji. Planuje się, że kod exploita zostaje opublikowany na GitHub w ciągu tygodnia po że dystrybucje wypuszczają aktualizację, która usuwa lukę.
W końcu jeśli chcesz dowiedzieć się więcej na ten temat, możesz sprawdzić szczegóły w następujący link.
Kolejny powód, aby nie dotykać snap kijem.