O vulnerabilitate critică în PolKit, care permite obținerea accesului root în cele mai multe distribuții Linux.

Compania Qualys a identificat o vulnerabilitate (CVE-2021-4034) în componenta de sistem Polkit (fost PolicyKit), utilizată în distribuitorile pentru a organiza efectuarea de acțiuni de către utilizatori neprivilegiați care necesită drepturi de acces sporite. Această vulnerabilitate permite unui utilizator local neprivilegiat să își crească privilegiile până la utilizator root și să obțină control total asupra sistemului. Problema a primit numele de cod PwnKit și este notabilă prin pregătirea unui exploit funcțional care funcționează în configurația implicită în majoritatea distribuțiilor Linux.

Problema este prezentă în utilitarul pkexec inclus în PolKit, livrat cu flag-ul SUID root și destinat să ruleze comenzi cu privilegii ale altui utilizator conform regulilor stabilite de PolKit. Din cauza gestionării incorecte a argumentelor din linia de comandă transmise către pkexec, un utilizator neprivilegiat putea ocoli autentificarea și reuși să își execute codul cu drepturi de root, indiferent de regulile de acces stabilite. Pentru atac, nu contează ce setări și restricții sunt definite în PolKit, este suficient ca executabilul utilitarului pkexec să aibă setat flag-ul SUID root.

Pkexec nu verifică corectitudinea contorului argumentelor din linia de comandă (argc) transmise la pornirea procesului. Dezvoltatorii pkexec au presupus că prima intrare din array-ul argv conține întotdeauna numele procesului (pkexec), iar a doua fie o valoare NULL, fie numele comenzii ce urmează să fie executată prin pkexec. Deoarece contorul argumentelor nu a fost verificat în raport cu conținutul real al array-ului și s-a presupus că este întotdeauna mai mare de 1, în cazul în care se transmite un array argv gol către proces, ceea ce este permis de funcția execve în Linux, pkexec interpreta valoarea NULL ca primul argument (numele procesului), iar memoria din afara bufferului ca fiind conținut suplimentar al array-ului. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | … | argv[argc] | envp[0] | envp[1] | … | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| V V V V V V «program» «-option» NULL «value» «PATH=name» NULL

Problema este că, urmează în memorie un array envp care conține variabilele de mediu. Astfel, în cazul unui array argv gol, pkexec extrage datele despre comanda executată cu privilegii sporite din primul element al array-ului cu variabile de mediu (argv[1] devenind identic cu envp[0]), conținutul căruia poate fi controlat de atacator.

Obținând valoarea argv[1], pkexec încearcă să determine calea completă către fișierul executabil, luând în considerare căile fișierelor din PATH, și să scrie un pointer la șirul cu calea completă înapoi în argv[1], ceea ce duce la suprascrierea valorii primei variabile de mediu, deoarece argv[1] este identic cu envp[0]. Prin manipularea numelui primei variabile de mediu, atacatorul poate realiza substituția unei alte variabile de mediu în pkexec, de exemplu, să introducă variabila de mediu „LD_PRELOAD”, care nu este permisă în programele suid, și să inițieze încărcarea unei biblioteci partajate din procesul său.

În exploit-ul funcțional se realizează substituția variabilei GCONV_PATH, care este utilizată pentru a defini calea către biblioteca de recodare a caracterelor, încărcată dinamic la apelarea funcției g_printerr(), în care este folosit iconv_open(). Reîntregind calea în GCONV_PATH, atacatorul poate obține încărcarea unei biblioteci iconv non-standard, iar handler-ii acesteia vor fi executați în timpul afișării mesajului de eroare în etapa în care pkexec încă rulează cu drepturi de root și înainte de verificarea autorizării execuției.

Se observă că, deși problema este cauzată de o defecțiune a memoriei, aceasta poate fi exploatată în mod fiabil și repetabil, indiferent de arhitectura hardware utilizată. Exploitul pregătit a fost testat cu succes în Ubuntu, Debian, Fedora și CentOS, dar poate fi folosit și în alte distribuții. Exploitul original nu este încă disponibil public, ceea ce indică faptul că este trivial și poate fi ușor recreat de alți cercetători, astfel că pe sistemele multi-utilizator este important să se instaleze cât mai repede actualizarea cu corecția. Polkit este de asemenea disponibil pentru sistemele BSD și Solaris, dar oportunitatea exploatării în acestea nu a fost studiată. Se știe doar că atacul nu poate fi realizat în OpenBSD, deoarece nucleul OpenBSD nu permite transmiterea unui argument argc nul la apelul execve().

Problema există din mai 2009, de când a fost adăugată comanda pkexec. Corectarea vulnerabilității din PolKit este disponibilă momentan sub forma unui patch (o versiune corectivă nu a fost formată), dar, deoarece dezvoltatorii distribuțiilor au fost informați în avans despre problemă, majoritatea distribuțiilor au publicat o actualizare simultan cu dezvăluirea informațiilor despre vulnerabilitate. Problema a fost remediată î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, se poate elimina flagul SUID root din programul /usr/bin/pkexec ("chmod 0755 /usr/bin/pkexec").



Sursa: opennet.ro
Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster