Root ranjivost u Linux kernelu i odbijanje usluge u systemd

Sigurnosni istraživači iz Qualysa otkrili su pojedinosti o dvije ranjivosti koje utječu na Linux kernel i systemd upravitelja sustava. Ranjivost u kernelu (CVE-2021-33909) omogućuje lokalnom korisniku da postigne izvršenje koda s root pravima kroz manipulaciju visoko ugniježđenih direktorija.

Opasnost od ranjivosti je pojačana činjenicom da su istraživači uspjeli pripremiti radne eksploatacije koje rade na Ubuntu 20.04/20.10/21.04, Debianu 11 i Fedori 34 u zadanoj konfiguraciji. Napominje se da druge distribucije nisu testirane, ali su teoretski također osjetljive na problem i mogu biti napadnute. Obećano je da će potpuni kod eksploatacija biti objavljen nakon što se problem posvuda eliminira, ali za sada je dostupan samo prototip ograničene funkcionalnosti, što uzrokuje pad sustava. Problem je prisutan od srpnja 2014. i utječe na izdanja kernela počevši od 3.16. Popravak ranjivosti usklađen je sa zajednicom i prihvaćen u kernel 19. srpnja. Glavne distribucije već su generirale ažuriranja svojih kernel paketa (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Ranjivost je uzrokovana neuspjehom provjere rezultata konverzije size_t u int prije izvođenja operacija u kodu seq_file, koji stvara datoteke iz niza zapisa. Neuspjeh provjere može dovesti do pisanja izvan granica međuspremnika prilikom stvaranja, montiranja i brisanja vrlo ugniježđene strukture direktorija (veličina staze veća od 1 GB). Kao rezultat toga, napadač može postići 10-bajtni niz "//izbrisano" napisan na pomaku od "-2 GB - 10 bajtova" koji pokazuje na područje neposredno ispred dodijeljenog međuspremnika.

Pripremljeni exploit zahtijeva 5 GB memorije i 1 milijun slobodnih inodesa za rad. Eksploatacija funkcionira pozivanjem mkdir() za stvaranje hijerarhije od oko milijun poddirektorija kako bi se postigla veličina staze datoteke koja prelazi 1 GB. Ovaj direktorij se montira putem bind-mount u zasebnom korisničkom imenskom prostoru, nakon čega se pokreće funkcija rmdir() da ga ukloni. Paralelno se stvara dretva koja učitava mali eBPF program, koji se blokira u fazi nakon provjere eBPF pseudokoda, ali prije njegove JIT kompilacije.

U neprivilegiranom korisničkom imenskom prostoru otvara se datoteka /proc/self/mountinfo i čita se dugačak naziv putanje direktorija montiranog vezanja, što rezultira upisivanjem niza "//izbrisano" u područje prije početka međuspremnika. Mjesto za pisanje retka bira se tako da prepisuje instrukciju u već testiranom, ali još neprevedenom eBPF programu.

Zatim, na razini programa eBPF, nekontrolirano pisanje izvan međuspremnika pretvara se u kontroliranu sposobnost čitanja i pisanja u druge strukture kernela kroz manipulaciju btf i map_push_elem struktura. Kao rezultat toga, eksploatacija utvrđuje lokaciju međuspremnika modprobe_path[] u memoriji kernela i prepisuje stazu "/sbin/modprobe" u njoj, što vam omogućuje da pokrenete bilo koju izvršnu datoteku s root pravima u slučaju request_module() poziv, koji se izvršava, na primjer, prilikom kreiranja netlink socketa.

Istraživači nude nekoliko rješenja koja su učinkovita samo za određeni exploit, ali ne eliminiraju sam problem. Preporuča se postaviti "/proc/sys/kernel/unprivileged_userns_clone" na 0 kako bi se onemogućilo montiranje direktorija u zasebnom prostoru imena korisničkog ID-a, a "/proc/sys/kernel/unprivileged_bpf_disabled" na 1 da bi se onemogućilo učitavanje eBPF programa u kernel.

Važno je napomenuti da su istraživači tijekom analize alternativnog napada koji uključuje korištenje mehanizma FUSE umjesto bind-mound za montiranje velikog direktorija naišli na još jednu ranjivost (CVE-2021-33910) koja utječe na upravitelja sustava systemd. Ispostavilo se da pri pokušaju montiranja direktorija s veličinom putanje većom od 8 MB putem FUSE-a, procesu inicijalizacije kontrole (PID1) ponestaje memorije steka i ruši se, što dovodi sustav u stanje "panike".

Problem je u tome što systemd prati i analizira sadržaj /proc/self/mountinfo i obrađuje svaku točku montiranja u funkciji unit_name_path_escape(), koja izvodi operaciju strdupa() koja smješta podatke na stog umjesto u dinamički dodijeljenu memoriju . Budući da je maksimalna veličina stoga ograničena preko RLIMIT_STACK, obrada prevelikog puta do točke montiranja uzrokuje rušenje PID1 procesa i zaustavljanje sustava. Za napad možete koristiti najjednostavniji modul FUSE u kombinaciji s korištenjem visoko ugniježđenog direktorija kao točke montiranja, čija veličina putanje prelazi 8 MB.

Problem se javlja od systemd 220 (travanj 2015.), već je popravljen u glavnom systemd repozitoriju i popravljen u distribucijama (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Naime, u izdanju systemd 248 eksploatacija ne radi zbog greške u kodu systemd koja uzrokuje neuspjeh obrade /proc/self/mountinfo. Također je zanimljivo da se 2018. godine dogodila slična situacija i kada su pokušavali napisati exploit za CVE-2018-14634 ranjivost u Linux kernelu, istraživači Qualysa su naišli na tri kritične ranjivosti u systemd-u.

Izvor: opennet.ru

Dodajte komentar