Vulnerabilità di root in u kernel Linux è denial of service in systemd

I ricercatori di sicurezza di Qualys anu revelatu dettagli di duie vulnerabilità chì afectanu u kernel Linux è u gestore di sistema di sistema. Una vulnerabilità in u kernel (CVE-2021-33909) permette à un utilizatore locale di ottene l'esekzione di codice cù diritti di root attraversu a manipulazione di cartulari assai nidificati.

U periculu di a vulnerabilità hè aggravatu da u fattu chì i circadori anu pussutu preparà sfruttamenti di travagliu chì travaglianu in Ubuntu 20.04/20.10/21.04, Debian 11 è Fedora 34 in a cunfigurazione predeterminata. Hè nutatu chì l'altri distribuzioni ùn sò micca stati pruvati, ma sò in teoria ancu suscettibile à u prublema è ponu esse attaccati. U codice sanu di i sfruttamenti hè prumessu di esse publicatu dopu chì u prublema hè eliminatu in ogni locu, ma per avà solu un prototipu di funziunalità limitata hè dispunibule, chì causanu u sistema di crash. U prublema hè presente da u lugliu 2014 è affetta e versioni di u kernel à partesi da 3.16. A correzione di vulnerabilità hè stata coordinata cù a cumunità è accettata in u kernel u 19 di lugliu. I distribuzioni principali anu digià generatu aghjurnamenti à i so pacchetti di kernel (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

A vulnerabilità hè causata da fallimentu di verificà u risultatu di una cunversione size_t à int prima di fà operazioni in u codice seq_file, chì crea schedari da una sequenza di registri. Un fallimentu di cuntrollà pò esse scritti fora di i limiti à u buffer quandu creanu, muntanu è sguassate una struttura di cartulare assai nidificata (taglia di u percorsu più grande di 1 GB). In u risultatu, un attaccu pò ottene una stringa di 10 byte "//deleted" scritta à un offset di "-2 GB - 10 bytes" chì punta à l'area immediatamente prima di u buffer assignatu.

U sfruttamentu preparatu richiede 5 GB di memoria è 1 milione di inodes gratuiti per operare. U sfruttamentu funziona chjamendu mkdir () per creà una gerarchia di circa un milione di subdirectorii per ottene una dimensione di u percorsu di u schedariu chì supera 1 GB. Stu repertoriu hè muntatu via bind-mount in un spaziu di nome d'utilizatore separatu, dopu chì a funzione rmdir () hè eseguita per sguassà. In parallelu, hè creatu un filu chì carica un picculu prugramma eBPF, chì hè bluccatu in u stadiu dopu à verificà u pseudocode eBPF, ma prima di a so compilazione JIT.

In u spaziu di nomi di userid senza privilege, u schedariu /proc/self/mountinfo hè apertu è u percorsu longu di u cartulare muntatu in bind hè lettu, risultatu in a stringa "//deleted" esse scritta à l'area prima di l'iniziu di u buffer. A pusizioni per scrive a linea hè scelta per chì soprascrive l'istruzzioni in u prugramma eBPF digià pruvatu ma micca ancu compilatu.

In seguitu, à u livellu di u prugramma eBPF, a scrittura incontrollata fora di u buffer hè trasfurmata in capacità cuntrullata di leghje è scrive à altre strutture di u kernel attraversu a manipulazione di e strutture btf è map_push_elem. In u risultatu, u sfruttamentu determina u locu di u buffer modprobe_path[] in a memoria di u kernel è soprascrive u percorsu "/sbin/modprobe" in questu, chì permette di inizià u lanciamentu di qualsiasi schedariu eseguibile cù diritti di root in casu di un request_module() call, chì hè eseguitu, per esempiu, quandu crea un socket netlink.

I ricercatori furniscenu parechje soluzioni chì sò efficace solu per un sfruttamentu specificu, ma ùn eliminanu micca u prublema stessu. Hè ricumandemu di stabilisce "/proc/sys/kernel/unprivileged_userns_clone" à 0 per disattivà i direttori di muntatura in un spaziu di nomi d'ID d'utilizatore separatu, è "/proc/sys/kernel/unprivileged_bpf_disabled" à 1 per disattivà a carica di prugrammi eBPF in u kernel.

Hè nutate chì mentre analizzavanu un attaccu alternativu chì implicava l'usu di u mecanismu FUSE invece di bind-mound per muntà un grande repertoriu, i circadori scontranu una altra vulnerabilità (CVE-2021-33910) chì affetta u gestore di sistema di sistema. Hè risultatu chì quandu si prova di muntà un repertoriu cù una dimensione di strada chì supera 8 MB via FUSE, u prucessu di inizializazione di cuntrollu (PID1) esce da a memoria di stack è crashs, chì mette u sistema in un statu di "panicu".

U prublema hè chì systemd traccia è analizeghja u cuntenutu di /proc/self/mountinfo, è processa ogni puntu di muntagna in a funzione unit_name_path_escape() , chì esegue una operazione strdupa () chì mette i dati nantu à a pila piuttostu cà in memoria allocata dinamicamente. . Siccomu a dimensione massima di stack hè limitata via RLIMIT_STACK, u processu di una strada troppu grande à u puntu di muntagna face chì u prucessu PID1 falle è ferma u sistema. Per un attaccu, pudete aduprà u modulu FUSE più simplice in cumbinazione cù l'usu di un repertoriu assai nidificatu cum'è un puntu di muntagna, chì a dimensione di a strada supera 8 MB.

U prublema hè apparsu da u systemd 220 (aprile 2015), hè digià riparatu in u repository systemd principale è riparatu in distribuzioni (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). In particulare, in a versione systemd 248, u sfruttamentu ùn funziona micca per via di un bug in u codice systemd chì causa u processu di /proc/self/mountinfo per fallu. Hè ancu interessante chì in 2018, una situazione simili hè ghjunta è quandu pruvate di scrive un sfruttamentu per a vulnerabilità CVE-2018-14634 in u kernel Linux, i circadori Qualys anu scupertu trè vulnerabili critichi in systemd.

Source: opennet.ru

Add a comment