Kritieke kwetsbaarheid in PolKit waardoor root-toegang op de meeste Linux-distributies mogelijk is

Qualys heeft een kwetsbaarheid (CVE-2021-4034) geïdentificeerd in de systeemcomponent Polkit (voorheen PolicyKit) die in distributies wordt gebruikt om gebruikers zonder rechten in staat te stellen acties uit te voeren waarvoor verhoogde toegangsrechten nodig zijn. Door de kwetsbaarheid kan een lokale gebruiker zonder privileges zijn privileges naar root vergroten en volledige controle over het systeem krijgen. Het probleem kreeg de codenaam PwnKit en is opmerkelijk vanwege het produceren van een werkende exploit die in de standaardconfiguratie op de meeste Linux-distributies draait.

Het probleem is aanwezig in het pkexec-hulpprogramma van PolKit, dat wordt geleverd met de SUID-rootvlag en is ontworpen om opdrachten uit te voeren met de rechten van een andere gebruiker volgens de opgegeven PolKit-regels. Als gevolg van onjuiste verwerking van opdrachtregelargumenten die aan pkexec worden doorgegeven, kan een gebruiker zonder rechten de authenticatie omzeilen en zijn code als root uitvoeren, ongeacht de ingestelde toegangsregels. Voor een aanval maakt het niet uit welke instellingen en beperkingen in PolKit zijn opgegeven; het is voldoende dat het SUID-rootattribuut voor het uitvoerbare bestand wordt ingesteld met het hulpprogramma pkexec.

Pkexec controleert niet de geldigheid van het aantal opdrachtregelargumenten (argc) dat wordt doorgegeven bij het starten van een proces. De ontwikkelaars van pkexec gingen ervan uit dat het eerste item in de argv-array altijd de naam van het proces (pkexec) bevat, en het tweede een NULL-waarde of de naam van het commando dat via pkexec wordt gelanceerd. Omdat het aantal argumenten niet werd gecontroleerd aan de hand van de daadwerkelijke inhoud van de array en werd aangenomen dat deze altijd groter was dan 1, zou pkexec NULL als het eerste argument behandelen als een proces een lege argv-array werd doorgegeven, zoals de Linux execve-functie toestaat. de procesnaam) en de volgende buiten het buffergeheugen, zoals de daaropvolgende inhoud van de array. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "programma" "-optie" NULL "waarde" "PATH=naam" NULL

Het probleem is dat er na de argv-array een envp-array in het geheugen staat die omgevingsvariabelen bevat. Dus als de argv-array leeg is, extraheert pkexec gegevens over de opdrachtuitvoering met verhoogde rechten uit het eerste element van de array met omgevingsvariabelen (argv[1] is identiek geworden aan envp[0]), waarvan de inhoud kan worden beheerd door de aanvaller.

Nadat de waarde van argv[1] is ontvangen, probeert pkexec, rekening houdend met de bestandspaden in PATH, het volledige pad naar het uitvoerbare bestand te bepalen en schrijft een pointer naar de string met het volledige pad terug naar argv[1], die leidt tot het overschrijven van de waarde van de eerste omgevingsvariabele, aangezien argv[ 1] identiek is aan envp[0]. Door de naam van de eerste omgevingsvariabele te manipuleren, kan een aanvaller een andere omgevingsvariabele in pkexec vervangen, bijvoorbeeld de omgevingsvariabele “LD_PRELOAD”, die niet is toegestaan ​​in suid-programma's, en ervoor zorgen dat hun gedeelde bibliotheek in de map wordt geladen. proces.

De werkende exploit omvat het vervangen van de GCONV_PATH variabele, die wordt gebruikt om het pad naar de symbooltranscoderingsbibliotheek te bepalen, die dynamisch wordt geladen bij het aanroepen van de functie g_printerr(), waarvan de code iconv_open() gebruikt. Door het pad in GCONV_PATH opnieuw te definiëren, kan een aanvaller ervoor zorgen dat niet de standaard iconv-bibliotheek wordt geladen, maar zijn eigen bibliotheek, waarvan de handlers worden uitgevoerd wanneer er een foutmelding wordt weergegeven in de fase waarin pkexec nog actief is met rootrechten en toestemmingen vóór het starten worden gecontroleerd.

Opgemerkt wordt dat ondanks het feit dat het probleem wordt veroorzaakt door geheugenbeschadiging, het betrouwbaar en herhaaldelijk kan worden uitgebuit, ongeacht de gebruikte hardwarearchitectuur. De voorbereide exploit is succesvol getest op Ubuntu, Debian, Fedora en CentOS, maar kan ook op andere distributies worden gebruikt. De oorspronkelijke exploit is nog niet openbaar beschikbaar, wat aangeeft dat deze triviaal is en gemakkelijk opnieuw kan worden gemaakt door andere onderzoekers. Het is dus belangrijk om de patchupdate zo snel mogelijk te installeren op systemen met meerdere gebruikers. Polkit is ook beschikbaar voor BSD-systemen en Solaris, maar is niet onderzocht voor gebruik daarop. Wat wel bekend is, is dat de aanval niet kan worden uitgevoerd op OpenBSD, omdat de OpenBSD-kernel niet toestaat dat een null argc-waarde wordt doorgegeven wanneer execve() wordt aangeroepen.

Het probleem doet zich voor sinds mei 2009, sinds de toevoeging van de opdracht pkexec. De oplossing voor de PolKit-kwetsbaarheid is momenteel beschikbaar als patch (er is geen patch-release uitgebracht), maar aangezien distributie-ontwikkelaars vooraf op de hoogte waren gesteld van het probleem, publiceerden de meeste distributies de update gelijktijdig met het vrijgeven van informatie over de kwetsbaarheid. Het probleem is opgelost in RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux en Manjaro. Als tijdelijke maatregel om het beveiligingslek te blokkeren, kunt u de SUID-hoofdvlag verwijderen uit het programma /usr/bin/pkexec (“chmod 0755 /usr/bin/pkexec”).



Bron: opennet.ru

Voeg een reactie