Vulnerabilitatea critică în PolKit care permite accesul root pe majoritatea distribuțiilor Linux

Qualys a identificat o vulnerabilitate (CVE-2021-4034) în componenta de sistem Polkit (fostă PolicyKit) utilizată în distribuții pentru a permite utilizatorilor neprivilegiati să efectueze acțiuni care necesită drepturi de acces ridicate. Vulnerabilitatea permite unui utilizator local neprivilegiat să-și escaladeze privilegiile la root și să obțină controlul deplin al sistemului. Problema a primit numele de cod PwnKit și este notabilă pentru producerea unui exploit de lucru care rulează în configurația implicită pe majoritatea distribuțiilor Linux.

Problema este prezentă în utilitarul pkexec al PolKit, care vine cu steag-ul rădăcină SUID și este conceput pentru a rula comenzi cu privilegiile altui utilizator conform regulilor PolKit specificate. Datorită manipulării incorecte a argumentelor din linia de comandă transmise către pkexec, un utilizator neprivilegiat poate ocoli autentificarea și poate determina rularea codului său ca root, indiferent de regulile de acces setate. Pentru un atac, nu contează ce setări și restricții sunt specificate în PolKit, este suficient ca atributul rădăcină SUID să fie setat pentru fișierul executabil cu utilitarul pkexec.

Pkexec nu verifică validitatea numărului de argumente din linia de comandă (argc) transmisă la pornirea unui proces. Dezvoltatorii pkexec au presupus că prima intrare din matricea argv conține întotdeauna numele procesului (pkexec), iar a doua fie o valoare NULL, fie numele comenzii lansate prin pkexec. Deoarece numărul de argumente nu a fost verificat în raport cu conținutul real al matricei și s-a presupus a fi întotdeauna mai mare decât 1, dacă unui proces i s-a trecut o matrice argv goală, așa cum permite funcția execve Linux, pkexec ar trata NULL ca prim argument ( numele procesului) și următorul ca în afara memoriei tampon, ca și conținutul următor al matricei. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV „program” „-opțiune” NULL „valoare” „PATH=nume” NULL

Problema este că după matricea argv există o matrice envp în memorie care conține variabile de mediu. Astfel, dacă matricea argv este goală, pkexec extrage date despre comanda rulată cu privilegii ridicate din primul element al matricei cu variabile de mediu (argv[1] a devenit identic cu envp[0]), al căror conținut poate fi controlat de către atacator.

După ce a primit valoarea argv[1], pkexec încearcă, ținând cont de căile fișierelor din PATH, să determine calea completă către fișierul executabil și scrie un pointer către șirul cu calea completă înapoi la argv[1], care duce la suprascrierea valorii primei variabile de mediu, deoarece argv[1] este identic cu envp[0]. Prin manipularea numelui primei variabile de mediu, un atacator poate înlocui o altă variabilă de mediu în pkexec, de exemplu, înlocui variabila de mediu „LD_PRELOAD”, care nu este permisă în programele suid, și poate aranja ca biblioteca lor partajată să fie încărcată în proces.

Exploatarea de lucru implică înlocuirea variabilei GCONV_PATH, care este utilizată pentru a determina calea către biblioteca de transcodare a simbolurilor, încărcată dinamic la apelarea funcției g_printerr(), al cărei cod folosește iconv_open(). Prin redefinirea căii în GCONV_PATH, un atacator se poate asigura că nu este încărcată biblioteca standard iconv, ci propria bibliotecă, a cărei handlere va fi executată atunci când este afișat un mesaj de eroare în stadiul în care pkexec încă rulează cu drepturile root și înainte de lansare sunt verificate permisiunile.

Se remarcă faptul că, în ciuda faptului că problema este cauzată de coruperea memoriei, aceasta poate fi exploatată în mod fiabil și repetat, indiferent de arhitectura hardware utilizată. Exploita-ul pregătit a fost testat cu succes pe Ubuntu, Debian, Fedora și CentOS, dar poate fi folosit și pe alte distribuții. Exploita-ul original nu este încă disponibil public, ceea ce indică faptul că este banal și poate fi recreat cu ușurință de către alți cercetători, așa că este important să instalați actualizarea patch-ului cât mai curând posibil pe sistemele cu mai mulți utilizatori. Polkit este disponibil și pentru sistemele BSD și Solaris, dar nu a fost studiat pentru utilizare pe acestea. Ceea ce se știe este că atacul nu poate fi efectuat pe OpenBSD, deoarece nucleul OpenBSD nu permite transmiterea unei valori argc nulă atunci când este apelat execve().

Problema este prezentă din mai 2009, de la adăugarea comenzii pkexec. Remedierea vulnerabilității PolKit este disponibilă în prezent sub formă de patch (nu a fost lansată nicio versiune de patch), dar, deoarece dezvoltatorii de distribuție au fost anunțați cu privire la problemă în prealabil, majoritatea distribuțiilor au publicat actualizarea simultan cu dezvăluirea informațiilor despre vulnerabilitate. Problema este rezolvată în RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux și Manjaro. Ca măsură temporară pentru a bloca vulnerabilitatea, puteți elimina steag-ul rădăcină SUID din programul /usr/bin/pkexec („chmod 0755 /usr/bin/pkexec”).



Sursa: opennet.ru

Adauga un comentariu