Kritická zraniteľnosť v PolKite umožňujúca prístup root na väčšine distribúcií Linuxu

Qualys identifikoval zraniteľnosť (CVE-2021-4034) v komponente systému Polkit (predtým PolicyKit), ktorý sa používa v distribúciách, aby umožnil neprivilegovaným používateľom vykonávať akcie vyžadujúce zvýšené prístupové práva. Zraniteľnosť umožňuje neprivilegovanému lokálnemu používateľovi eskalovať svoje privilégiá na root a získať plnú kontrolu nad systémom. Problém mal kódové označenie PwnKit a je pozoruhodný tým, že produkuje pracovný exploit, ktorý beží v predvolenej konfigurácii na väčšine distribúcií Linuxu.

Problém je v obslužnom programe PolKit pkexec, ktorý sa dodáva s koreňovým príznakom SUID a je navrhnutý na spúšťanie príkazov s oprávneniami iného používateľa podľa špecifikovaných pravidiel PolKitu. V dôsledku nesprávneho spracovania argumentov príkazového riadka odovzdaných do pkexec mohol neprivilegovaný používateľ obísť autentifikáciu a spustiť svoj kód ako root bez ohľadu na nastavené pravidlá prístupu. Pri útoku nezáleží na tom, aké nastavenia a obmedzenia sú špecifikované v PolKite, stačí, aby bol pre spustiteľný súbor nastavený pomocou utility pkexec root SUID atribút.

Pkexec nekontroluje platnosť počtu argumentov príkazového riadku (argc) odovzdaného pri spustení procesu. Vývojári pkexec predpokladali, že prvá položka v poli argv vždy obsahuje názov procesu (pkexec) a druhá buď hodnotu NULL alebo názov príkazu spusteného cez pkexec. Keďže počet argumentov nebol porovnaný so skutočným obsahom poľa a predpokladalo sa, že je vždy väčší ako 1, ak proces odovzdal prázdne pole argv, ako to umožňuje funkcia Linux execve, pkexec by považoval NULL za prvý argument ( názov procesu) a ďalší ako mimo vyrovnávacej pamäte, ako je nasledujúci obsah poľa. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "program" "-opcia" NULL "hodnota" "PATH=meno" NULL

Problém je v tom, že po poli argv je v pamäti pole envp obsahujúce premenné prostredia. Ak je teda pole argv prázdne, pkexec extrahuje údaje o spustení príkazu so zvýšenými oprávneniami z prvého prvku poľa s premennými prostredia (argv[1] sa stal identickým s envp[0]), ktorých obsah je možné ovládať zo strany útočníka.

Po prijatí hodnoty argv[1] sa pkexec pokúsi, berúc do úvahy cesty k súborom v PATH, určiť úplnú cestu k spustiteľnému súboru a zapíše ukazovateľ na reťazec s úplnou cestou späť na argv[1], ktorý vedie k prepísaniu hodnoty prvej premennej prostredia, pretože argv[ 1] je identické s envp[0]. Manipuláciou s názvom prvej premennej prostredia môže útočník nahradiť inú premennú prostredia v pkexec, napríklad nahradiť premennú prostredia „LD_PRELOAD“, ktorá nie je povolená v suid programoch, a zariadiť, aby sa ich zdieľaná knižnica načítala do proces.

Pracovný exploit zahŕňa nahradenie premennej GCONV_PATH, ktorá sa používa na určenie cesty ku knižnici transkódovania symbolov, dynamicky načítanej pri volaní funkcie g_printerr(), ktorej kód používa iconv_open(). Predefinovaním cesty v GCONV_PATH môže útočník zabezpečiť, že sa nenačíta štandardná knižnica iconv, ale jeho vlastná knižnica, ktorej obslužné programy sa spustia, keď sa zobrazí chybové hlásenie vo fáze, keď je pkexec stále spustený s root práva a pred spustením sa skontrolujú povolenia.

Je potrebné poznamenať, že napriek skutočnosti, že problém je spôsobený poškodením pamäte, možno ho spoľahlivo a opakovane zneužiť bez ohľadu na použitú hardvérovú architektúru. Pripravený exploit bol úspešne testovaný na Ubuntu, Debiane, Fedore a CentOS, ale dá sa použiť aj na iných distribúciách. Pôvodný exploit ešte nie je verejne dostupný, čo naznačuje, že je triviálny a iní výskumníci ho môžu ľahko znova vytvoriť, takže je dôležité čo najskôr nainštalovať aktualizáciu opravy na systémy s viacerými používateľmi. Polkit je dostupný aj pre systémy BSD a Solaris, ale jeho použitie na nich nebolo skúmané. Je známe, že útok nemožno vykonať na OpenBSD, pretože jadro OpenBSD neumožňuje odovzdanie hodnoty null argc pri volaní execve().

Problém je prítomný od mája 2009, od pridania príkazu pkexec. Oprava zraniteľnosti PolKit je momentálne dostupná ako záplata (nebola vydaná žiadna oprava), ale keďže vývojári distribúcie boli na problém upozornení vopred, väčšina distribúcií zverejnila aktualizáciu súčasne so zverejnením informácií o zraniteľnosti. Problém je opravený v RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux a Manjaro. Ako dočasné opatrenie na zablokovanie tejto zraniteľnosti môžete odstrániť koreňový príznak SUID z programu /usr/bin/pkexec („chmod 0755 /usr/bin/pkexec“).



Zdroj: opennet.ru

Pridať komentár