Root ranjivost u Linux kernelu i uskraćivanje usluge u systemd

Istraživači sigurnosti iz Qualysa otkrili su detalje o dvije ranjivosti koje utiču na Linux kernel i systemd sistem menadžer. Ranjivost u kernelu (CVE-2021-33909) omogućava lokalnom korisniku da postigne izvršenje koda s root pravima kroz manipulaciju visoko ugniježđenim direktorijima.

Opasnost od ranjivosti se pogoršava činjenicom da su istraživači uspjeli pripremiti radne exploite koji 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 podložne problemu i mogu biti napadnute. Obećano je da će kompletan kod eksploatacije biti objavljen nakon što problem bude svuda eliminisan, ali za sada je dostupan samo prototip ograničene funkcionalnosti, što uzrokuje pad sistema. Problem je prisutan od jula 2014. i utiče na izdanja kernela počevši od 3.16. Ispravka ranjivosti je koordinirana sa zajednicom i prihvaćena u kernel 19. jula. Glavne distribucije su već generirale ažuriranja za svoje kernel pakete (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Ranjivost je uzrokovana nemogućnošću provjere rezultata konverzije size_t u int prije izvođenja operacija u kodu seq_file, koji kreira datoteke iz niza zapisa. Neprovjera može rezultirati upisivanjem izvan granica u međuspremnik prilikom kreiranja, montiranja i brisanja vrlo ugniježđene strukture direktorija (veličina putanje veća od 1 GB). Kao rezultat toga, napadač može postići niz od 10 bajta "//deleted" napisan na pomaku od "-2 GB - 10 bajtova" koji pokazuje na područje neposredno ispred dodijeljenog bafera.

Za rad pripremljenog exploit-a potrebno je 5 GB memorije i 1 milion slobodnih inoda. Eksploatacija funkcioniše tako što poziva mkdir() da kreira hijerarhiju od oko milion poddirektorija kako bi se postigla veličina putanje datoteke koja prelazi 1 GB. Ovaj direktorij se montira putem bind-mount u odvojenom korisničkom imenskom prostoru, nakon čega se pokreće funkcija rmdir() da ga ukloni. Paralelno, kreira se nit koja učitava mali eBPF program, koji je blokiran u fazi nakon provjere eBPF pseudokoda, ali prije njegove JIT kompilacije.

U neprivilegovanom korisničkom imenskom prostoru otvara se datoteka /proc/self/mountinfo i čita se dugačko ime putanje direktorija montiranog na vezanje, što rezultira nizom "//deleted" koji se upisuje u područje prije početka bafera. Pozicija za upisivanje reda je odabrana tako da prepisuje instrukciju u već testiranom, ali još ne kompajliranom eBPF programu.

Zatim, na nivou programa eBPF, nekontrolisano pisanje van bafera se transformiše u kontrolisanu sposobnost čitanja i pisanja u druge strukture kernela kroz manipulaciju strukturama btf i map_push_elem. Kao rezultat toga, eksploatacija određuje lokaciju međuspremnika modprobe_path[] u memoriji kernela i prepisuje putanju “/sbin/modprobe” u njemu, što vam omogućava da pokrenete pokretanje bilo koje izvršne datoteke s root pravima u slučaju request_module() poziv, koji se izvršava, na primjer, prilikom kreiranja netlink socketa.

Istraživači pružaju nekoliko rješenja koja su efikasna samo za određeni eksploat, ali ne eliminišu sam problem. Preporučljivo je postaviti "/proc/sys/kernel/unprivileged_userns_clone" na 0 da onemogućite montiranje direktorija u zasebnom korisničkom ID imenskom prostoru, a "/proc/sys/kernel/unprivileged_bpf_disabled" na 1 da onemogućite učitavanje eBPF programa u kernel.

Važno je napomenuti da su istraživači naišli na još jednu ranjivost (CVE-2021-33910) koja utiče na sistemski menadžer sistema, dok su analizirali alternativni napad koji uključuje upotrebu FUSE mehanizma umjesto bind-mounda za montiranje velikog direktorija. Ispostavilo se da kada se pokuša montirati direktorij čija je putanja veća od 8 MB preko FUSE-a, proces inicijalizacije kontrole (PID1) ostaje bez memorije steka i ruši se, što dovodi sistem u „panično“ stanje.

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

Problem se pojavljuje od systemd 220 (april 2015.), već je popravljen u glavnom systemd spremištu i popravljen u distribucijama (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Posebno, u systemd izdanju 248 eksploatacija ne radi zbog greške u systemd kodu koja uzrokuje neuspjeh obrade /proc/self/mountinfo. Zanimljivo je i da se 2018. godine dogodila slična situacija i kada su pokušavali da napišu exploit za CVE-2018-14634 ranjivost u Linux kernelu, Qualysovi istraživači su naišli na tri kritične ranjivosti u systemd-u.

izvor: opennet.ru

Dodajte komentar