Kritická zranitelnost v PolKit, která umožňuje získat root přístup ve většině distribucí Linuxu

Společnost Qualys odhalila zranitelnost (CVE-2021-4034) v systémové komponentě Polkit (dříve PolicyKit), která se používá v distribucích k organizaci provádění činností, které vyžadují zvýšená oprávnění, neprivilegovanými uživateli. Zranitelnost umožňuje neprivilegovanému lokálnímu uživateli zvýšit své oprávnění na uživatele root a získat plnou kontrolu nad systémem. Problém dostal kódové jméno PwnKit a je pozoruhodný připravením funkčního exploitu, který funguje v konfiguraci podle výchozích nastavení ve většině distribucí Linuxu.

Problém se vyskytuje v nástroji pkexec, který je součástí PolKit, dodávaného s příznakem SUID root a určeného k spuštění příkazů s oprávněními jiného uživatele v souladu s pravidly PolKit. Vzhledem k nesprávnému zpracování předávaných argumentů příkazového řádku do pkexec mohl neprivilegovaný uživatel obejít autentifikaci a spustit svůj kód s oprávněním root, bez ohledu na nastavená pravidla přístupu. Pro útok není důležité, jaká nastavení a omezení jsou v PolKit nastavena, stačí, aby byl pro spustitelný soubor s nástrojem pkexec nastaven příznak SUID root.

Pkexec nekontroluje správnost počtu argumentů příkazového řádku (argc), které jsou předávány při spuštění procesu. Vývojáři pkexec předpokládali, že první záznam pole 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. Protože nebyl kontrolován počet argumentů na shodu se skutečným obsahem pole a předpokládalo se, že je vždy větší než 1, v případě předání prázdného pole argv, což funkce execve v Linuxu umožňuje, pkexec považoval hodnotu NULL za první argument (název procesu) a následující paměť za hranicemi bufferu jako další obsah pole. |———+———+——+————|———+———+——+————| | 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

Problém je v tom, že za polem argv v paměti následně umístěno pole envp, které obsahuje proměnné prostředí. Tímto způsobem, při prázdném poli argv, pkexec získává údaje o spouštěném příkazu s zvýšenými oprávněními z prvního prvku pole s proměnnými prostředí (argv[1] se stává identickým envp[0]), jehož obsah může útočník ovládat.

Poté, co získá hodnotu argv[1], pkexec se pokouší na základě souborových cest v PATH určit úplnou cestu k spustitelnému souboru a zapíše ukazatel na řetězec s úplnou cestou zpět do argv[1], což vede k přepsání hodnoty první proměnné prostředí, protože argv[1] je identické envp[0]. Pomocí manipulace s názvem první proměnné prostředí může útočník provést substituci jiné proměnné prostředí v pkexec, například substituovat proměnnou prostředí „LD_PRELOAD“, která není povolena v suid programech, a uspořádat načtení své sdílené knihovny do procesu.

V pracovním exploitaci dochází ke substituci proměnné GCONV_PATH, která se používá k určení cesty ke knihovně pro převod znaků, dynamicky načítané při volání funkce g_printerr(), v jejímž kódu se používá iconv_open(). Předefinováním cesty v GCONV_PATH může útočník dosáhnout načtení nepovolené knihovny iconv, ale jeho vlastní knihovny, jejíž zpracovatele budou vykonány během výstupu chybové zprávy ve fázi, kdy pkexec ještě běží s právy root a před kontrolou oprávnění pro spuštění.

Je zaznamenáno, že i když je problém způsoben poškozením paměti, může být spolehlivě a opakovaně využíván bez ohledu na použitou hardwarovou architekturu. Připravený exploit byl úspěšně testován na Ubuntu, Debian, Fedora a CentOS, ale může být použit i na jiných distribucích. Originální exploit zatím není veřejně dostupný, což svědčí o tom, že je triviální a může být snadno reprodukován jinými výzkumníky, takže na vícestupňových systémech je důležité co nejdříve nainstalovat aktualizaci s opravou. Polkit je také dostupný pro BSD systémy a Solaris, ale zkoumání možnosti exploatace tam nebylo provedeno. Je známo pouze to, že útok nemůže být proveden v OpenBSD, protože jádro OpenBSD neumožňuje předávání nulové hodnoty argc při volání execve().

Problém existuje od května 2009, od doby přidání příkazu pkexec. Oprava zranitelnosti v PolKit je zatím k dispozici formou patch (opravené vydání nebylo vytvořeno), ale protože byly vývojáři distribucí předem upozorněni na problém, většina distribucí zveřejnila aktualizaci zároveň s odhalením zranitelnosti. Problém byl vyřešen 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í pro zablokování zranitelnosti lze odebrat příznak SUID root z programu /usr/bin/pkexec („chmod 0755 /usr/bin/pkexec“).



Zdroj: opennet.ru
Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster