Kritisk sårbarhet i PolKit som tillåter root-åtkomst på de flesta Linux-distributioner

Qualys har identifierat en sårbarhet (CVE-2021-4034) i systemkomponenten Polkit (tidigare PolicyKit) som används i distributioner för att tillåta oprivilegierade användare att utföra åtgärder som kräver förhöjda åtkomsträttigheter. Sårbarheten tillåter en oprivilegierad lokal användare att eskalera sina privilegier för att roota och få full kontroll över systemet. Problemet fick kodnamnet PwnKit och är känt för att producera en fungerande exploit som körs i standardkonfigurationen på de flesta Linux-distributioner.

Problemet finns i PolKits pkexec-verktyg, som kommer med SUID-rotflaggan och är utformat för att köra kommandon med en annan användares behörighet enligt de angivna PolKit-reglerna. På grund av felaktig hantering av kommandoradsargument som skickats till pkexec, kunde en oprivilegierad användare kringgå autentisering och köra sin kod som root, oavsett vilka åtkomstregler som ställts in. För en attack spelar det ingen roll vilka inställningar och begränsningar som anges i PolKit, det räcker att SUID-rotattributet ställs in för den körbara filen med pkexec-verktyget.

Pkexec kontrollerar inte giltigheten av kommandoradens argumenträkning (argc) som skickas när en process startas. Utvecklarna av pkexec antog att den första posten i argv-arrayen alltid innehåller namnet på processen (pkexec), och den andra antingen ett NULL-värde eller namnet på kommandot som startas via pkexec. Eftersom argumentantalet inte kontrollerades mot det faktiska innehållet i arrayen och antogs alltid vara större än 1, om en process passerade en tom argv-array, som Linux execve-funktionen tillåter, skulle pkexec behandla NULL som det första argumentet ( processnamnet) och nästa som utanför buffertminnet, som det efterföljande innehållet i arrayen. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "program" "-option" NULL "värde" "PATH=namn" NULL

Problemet är att efter argv-arrayen finns det en envp-array i minnet som innehåller miljövariabler. Således, om argv-matrisen är tom, extraherar pkexec data om kommandot som körs med förhöjda privilegier från det första elementet i matrisen med miljövariabler (argv[1] blev identisk med envp[0]), vars innehåll kan kontrolleras av angriparen.

Efter att ha fått värdet på argv[1] försöker pkexec, med hänsyn till filsökvägarna i PATH, bestämma den fullständiga sökvägen till den körbara filen och skriver en pekare till strängen med den fullständiga sökvägen tillbaka till argv[1], vilket leder till att värdet på den första miljövariabeln skrivs över, eftersom argv[1] är identisk med envp[0]. Genom att manipulera namnet på den första miljövariabeln kan en angripare ersätta en annan miljövariabel i pkexec, till exempel ersätta miljövariabeln "LD_PRELOAD", som inte är tillåten i suid-program, och ordna så att deras delade bibliotek laddas in i bearbeta.

Arbetsexploatet innebär att GCONV_PATH-variabeln ersätts, som används för att bestämma sökvägen till symbolomkodningsbiblioteket, som laddas dynamiskt när funktionen g_printerr() anropas, vars kod använder iconv_open(). Genom att omdefiniera sökvägen i GCONV_PATH kan en angripare säkerställa att det inte är standard iconv-biblioteket som laddas, utan dess eget bibliotek, från vilket hanterarna kommer att exekveras när ett felmeddelande visas i det skede då pkexec fortfarande körs med roträttigheter och behörigheter före start kontrolleras.

Det noteras att trots att problemet orsakas av minneskorruption, kan det tillförlitligt och upprepat utnyttjas oavsett vilken hårdvaruarkitektur som används. Den förberedda exploateringen har framgångsrikt testats på Ubuntu, Debian, Fedora och CentOS, men kan även användas på andra distributioner. Den ursprungliga exploateringen är ännu inte tillgänglig för allmänheten, vilket indikerar att den är trivial och lätt kan återskapas av andra forskare, så det är viktigt att installera patchuppdateringen så snart som möjligt på fleranvändarsystem. Polkit är också tillgängligt för BSD-system och Solaris, men har inte studerats för användning på dem. Vad som är känt är att attacken inte kan utföras på OpenBSD, eftersom OpenBSD-kärnan inte tillåter att ett noll argc-värde skickas när execve() anropas.

Problemet har funnits sedan maj 2009, sedan kommandot pkexec lades till. Korrigeringen för PolKit-sårbarheten är för närvarande tillgänglig som en patch (ingen patch-release har släppts), men eftersom distributionsutvecklare informerades om problemet i förväg, publicerade de flesta distributioner uppdateringen samtidigt med information om sårbarheten. Problemet är åtgärdat i RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux och Manjaro. Som en tillfällig åtgärd för att blockera sårbarheten kan du ta bort SUID-rotflaggan från /usr/bin/pkexec-programmet ("chmod 0755 /usr/bin/pkexec").



Källa: opennet.ru

Lägg en kommentar