Vulnerabilitatea rădăcină în nucleul Linux și refuzul serviciului în systemd

Cercetătorii de securitate de la Qualys au dezvăluit detalii despre două vulnerabilități care afectează kernel-ul Linux și managerul de sistem systemd. O vulnerabilitate a nucleului (CVE-2021-33909) permite unui utilizator local să realizeze execuția codului cu drepturi root prin manipularea directoarelor foarte imbricate.

Pericolul vulnerabilității este agravat de faptul că cercetătorii au reușit să pregătească exploit-uri de lucru care funcționează pe Ubuntu 20.04/20.10/21.04, Debian 11 și Fedora 34 în configurația implicită. Se observă că alte distribuții nu au fost testate, dar teoretic sunt, de asemenea, susceptibile la problemă și pot fi atacate. Se promite că întregul cod al exploit-urilor va fi publicat după ce problema va fi eliminată peste tot, dar deocamdată este disponibil doar un prototip cu funcționalitate limitată, ceea ce provoacă blocarea sistemului. Problema este prezentă din iulie 2014 și afectează lansările de kernel începând cu 3.16. Remedierea vulnerabilității a fost coordonată cu comunitatea și acceptată în kernel pe 19 iulie. Principalele distribuții au generat deja actualizări pentru pachetele lor de kernel (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Vulnerabilitatea este cauzată de eșecul verificării rezultatului unei conversii size_t la int înainte de a efectua operațiuni în codul seq_file, care creează fișiere dintr-o secvență de înregistrări. Eșecul verificării poate duce la scrieri în afara limitelor în buffer la crearea, montarea și ștergerea unei structuri de directoare foarte imbricate (dimensiunea căii mai mare de 1 GB). Ca rezultat, un atacator poate obține un șir de 10 octeți „//șters” scris la un offset de „-2 GB - 10 octeți” care indică zona imediat anterioară tamponului alocat.

Exploatarea pregătită necesită 5 GB de memorie și 1 milion de inoduri libere pentru a funcționa. Exploatarea funcționează prin apelarea mkdir() pentru a crea o ierarhie de aproximativ un milion de subdirectoare pentru a obține o dimensiune a căii fișierului care depășește 1 GB. Acest director este montat prin bind-mount într-un spațiu de nume utilizator separat, după care funcția rmdir() este rulată pentru a-l elimina. În paralel, se creează un fir care încarcă un mic program eBPF, care este blocat în etapa după verificarea pseudocodului eBPF, dar înainte de compilarea lui JIT.

În spațiul de nume userid neprivilegiat, fișierul /proc/self/mountinfo este deschis și calea lungă a directorului montat în legătură este citită, rezultând în șirul „//deleted” scris în zonă înainte de începerea buffer-ului. Poziția de scriere a liniei este aleasă astfel încât să suprascrie instrucțiunea din programul eBPF deja testat, dar necompilat încă.

În continuare, la nivelul programului eBPF, scrierea necontrolată în afara memoriei tampon este transformată într-o capacitate controlată de a citi și scrie în alte structuri de kernel prin manipularea structurilor btf și map_push_elem. Ca urmare, exploit-ul determină locația buffer-ului modprobe_path[] în memoria kernelului și suprascrie calea „/sbin/modprobe” în acesta, ceea ce vă permite să inițiați lansarea oricărui fișier executabil cu drepturi root în cazul unui apel request_module(), care este executat, de exemplu, la crearea soclului netlink.

Cercetătorii oferă mai multe soluții care sunt eficiente doar pentru o anumită exploatare, dar nu elimină problema în sine. Este recomandat să setați „/proc/sys/kernel/unprivileged_userns_clone” la 0 pentru a dezactiva directoarele de montare într-un spațiu de nume ID utilizator separat și „/proc/sys/kernel/unprivileged_bpf_disabled” la 1 pentru a dezactiva încărcarea programelor eBPF în nucleu.

Este de remarcat faptul că, în timp ce analizau un atac alternativ care implică utilizarea mecanismului FUSE în loc de bind-mound pentru a monta un director mare, cercetătorii au dat peste o altă vulnerabilitate (CVE-2021-33910) care afectează managerul de sistem systemd. S-a dovedit că atunci când încercați să montați un director cu o dimensiune a căii care depășește 8 MB prin FUSE, procesul de inițializare a controlului (PID1) epuizează memoria stivă și se blochează, ceea ce pune sistemul într-o stare de „panică”.

Problema este că systemd urmărește și analizează conținutul /proc/self/mountinfo și procesează fiecare punct de montare în funcția unit_name_path_escape(), care efectuează o operație strdupa() care plasează datele în stivă mai degrabă decât în ​​memoria alocată dinamic. . Deoarece dimensiunea maximă a stivei este limitată prin RLIMIT_STACK, procesarea unei căi prea mari către punctul de montare face ca procesul PID1 să se blocheze și să oprească sistemul. Pentru un atac, puteți utiliza cel mai simplu modul FUSE în combinație cu utilizarea unui director foarte imbricat ca punct de montare, a cărui dimensiune a căii depășește 8 MB.

Problema apare de la systemd 220 (aprilie 2015), a fost deja remediată în depozitul principal systemd și remediată în distribuții (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). În special, în versiunea 248 systemd, exploit-ul nu funcționează din cauza unei erori în codul systemd care determină eșecul procesării /proc/self/mountinfo. De asemenea, este interesant că în 2018, a apărut o situație similară și când au încercat să scrie un exploit pentru vulnerabilitatea CVE-2018-14634 în kernel-ul Linux, cercetătorii Qualys au dat peste trei vulnerabilități critice în systemd.

Sursa: opennet.ru

Adauga un comentariu