Kritická zranitelnost v PolKitu umožňující přístup root ve většině distribucí Linuxu

Qualys identifikoval zranitelnost (CVE-2021-4034) v systémové komponentě Polkit (dříve PolicyKit), která se používá v distribucích, aby umožnila neprivilegovaným uživatelům provádět akce, které vyžadují zvýšená přístupová práva. Tato chyba zabezpečení umožňuje nepřivilegovanému místnímu uživateli eskalovat svá oprávnění na root a získat plnou kontrolu nad systémem. Problém byl označen kódovým označením PwnKit a je pozoruhodný tím, že vytváří pracovní exploit, který běží ve výchozí konfiguraci na většině distribucí Linuxu.

Problém je v obslužném programu pkexec od PolKitu, který je dodáván s kořenovým příznakem SUID a je navržen pro spouštění příkazů s oprávněními jiného uživatele podle specifikovaných pravidel PolKitu. Kvůli nesprávnému zpracování argumentů příkazového řádku předávaných do pkexec by mohl neprivilegovaný uživatel obejít ověřování a spustit svůj kód jako root, bez ohledu na nastavená pravidla přístupu. U útoku nezáleží na tom, jaká nastavení a omezení jsou v PolKitu specifikována, stačí, když je u spustitelného souboru pomocí utility pkexec nastaven atribut SUID root.

Pkexec nekontroluje platnost počtu argumentů příkazového řádku (argc) předávaného při spouštění procesu. Vývojáři pkexec předpokládali, že první položka v poli argv vždy obsahuje název procesu (pkexec) a druhá buď hodnotu NULL, nebo název příkazu spouštěného přes pkexec. Vzhledem k tomu, že počet argumentů nebyl kontrolován proti skutečnému obsahu pole a předpokládalo se, že je vždy větší než 1, pokud procesu bylo předáno prázdné pole argv, jak to umožňuje funkce Linux execve, pkexec by považoval NULL za první argument ( název procesu) a další jako mimo vyrovnávací paměť, jako následný obsah pole. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "program" "-volba" NULL "hodnota" "PATH=jméno" NULL

Problém je v tom, že po poli argv je v paměti pole envp obsahující proměnné prostředí. Pokud je tedy pole argv prázdné, pkexec extrahuje data o příkazu spuštěném se zvýšenými oprávněními z prvního prvku pole s proměnnými prostředí (argv[1] se stal identickým s envp[0]), jehož obsah lze ovládat ze strany útočníka.

Po obdržení hodnoty argv[1] se pkexec pokusí, s ohledem na cesty k souboru v PATH, určit úplnou cestu ke spustitelnému souboru a zapíše ukazatel na řetězec s úplnou cestou zpět na argv[1], který vede k přepsání hodnoty první proměnné prostředí, protože argv[ 1] je identické s envp[0]. Manipulací s názvem první proměnné prostředí může útočník nahradit jinou proměnnou prostředí v pkexec, například nahradit proměnnou prostředí „LD_PRELOAD“, což není v suid programech povoleno, a zařídit, aby jejich sdílená knihovna byla načtena do proces.

Pracovní exploit zahrnuje nahrazení proměnné GCONV_PATH, která se používá k určení cesty ke knihovně transkódování symbolů, dynamicky načítané při volání funkce g_printerr(), jejíž kód používá iconv_open(). Předefinováním cesty v GCONV_PATH může útočník zajistit, že se nenačte standardní knihovna iconv, ale její vlastní knihovna, jejíž obslužné rutiny budou spuštěny, když se zobrazí chybová zpráva ve fázi, kdy pkexec stále běží s práva root a před spuštěním se kontrolují oprávnění.

Je třeba poznamenat, že navzdory skutečnosti, že problém je způsoben poškozením paměti, lze jej spolehlivě a opakovaně zneužít bez ohledu na použitou hardwarovou architekturu. Připravený exploit byl úspěšně testován na Ubuntu, Debianu, Fedoře a CentOS, ale lze jej použít i na jiných distribucích. Původní exploit zatím není veřejně dostupný, což naznačuje, že je triviální a může být snadno znovu vytvořen jinými výzkumníky, takže je důležité nainstalovat aktualizaci opravy co nejdříve na systémy s více uživateli. Polkit je k dispozici také pro systémy BSD a Solaris, ale použití na nich nebylo studováno. Je známo, že útok nelze provést na OpenBSD, protože jádro OpenBSD neumožňuje předání hodnoty null argc při volání execve().

Problém se vyskytuje od května 2009, od přidání příkazu pkexec. Oprava zranitelnosti PolKit je aktuálně dostupná jako oprava (nebyla vydána žádná oprava), ale protože vývojáři distribuce byli na problém předem upozorněni, většina distribucí aktualizaci zveřejnila současně se zveřejněním informací o zranitelnosti. Problém je opraven v RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux a Manjaro. Jako dočasné opatření k zablokování této chyby zabezpečení můžete odebrat kořenový příznak SUID z programu /usr/bin/pkexec („chmod 0755 /usr/bin/pkexec“).



Zdroj: opennet.ru

Přidat komentář