Kritieke kwetsbaarheid in PolKit waarmee roottoegang kan worden verkregen in de meeste Linux-distributies.

Het bedrijf Qualys heeft een kwetsbaarheid (CVE-2021-4034) ontdekt in de systeemcomponent Polkit (voorheen PolicyKit), die wordt gebruikt in distributies om niet-priviligieerde gebruikers in staat te stellen acties uit te voeren die verhoogde toegangsrechten vereisen. De kwetsbaarheid stelt een niet-priviligieerde lokale gebruiker in staat om zijn privileges te verhogen tot die van de root-gebruiker en volledige controle over het systeem te verkrijgen. Het probleem kreeg de codenaam PwnKit en is opmerkelijk vanwege de beschikbaarheid van een werkende exploit die in de standaardconfiguratie van de meeste Linux-distributies functioneert.

Het probleem doet zich voor in de PolKit-tool pkexec, die wordt geleverd met de SUID-root-vlag en bedoeld is om opdrachten met de privileges van een andere gebruiker uit te voeren volgens de voorgeschreven PolKit-regels. Vanwege een onjuiste verwerking van doorgegeven argumenten in de opdrachtregel aan pkexec kon een niet-priviligieerde gebruiker de authenticatie omzeilen en zijn code onder root-rechten laten uitvoeren, ongeacht de ingestelde toegangsregels. Voor de aanval zijn de configuraties en beperkingen in PolKit irrelevant, het enige dat nodig is, is dat het uitvoerbare bestand met de pkexec-tool de SUID-root-vlag heeft.

Pkexec controleert de geldigheid van de argumententeller van de opdrachtregel (argc) niet bij het starten van het proces. De ontwikkelaars van pkexec gingen ervan uit dat de eerste invoer van de array argv altijd de procesnaam (pkexec) bevat, en de tweede ofwel NULL of de naam van het via pkexec uit te voeren commando. Aangezien de argumententeller niet werd gecontroleerd in verhouding tot de feitelijke inhoud van de array en er vanuit werd gegaan dat deze altijd groter was dan 1, beschouwde pkexec in het geval van een lege argv-array, wat door de functie execve in Linux is toegestaan, de waarde NULL als het eerste argument (procesnaam), en het geheugen dat zich buiten de buffer bevindt, als de rest van de inhoud van de array.

Het probleem is dat, achter de argv-array in het geheugen, de envp-array ligt, die omgevingsvariabelen bevat. Dus als de argv-array leeg is, haalt pkexec gegevens over de met verhoogde privileges uitgevoerde opdracht uit het eerste element van de omgevingsvariabelen-array (argv[1] wordt gelijk aan envp[0]), waarvan de inhoud door de aanvaller kan worden gecontroleerd.

Nadat pkexec de waarde van argv[1] heeft verkregen, probeert het, rekening houdend met de bestands paden in PATH, het volledige pad naar het uitvoerbare bestand te bepalen en schrijft het een pointer naar de string met het volledige pad terug naar argv[1], wat leidt tot het overschrijven van de waarde van de eerste omgevingsvariabele, aangezien argv[1] gelijk is aan envp[0]. Door te manipuleren met de naam van de eerste omgevingsvariabele kan de aanvaller een andere omgevingsvariabele substitueren in pkexec, bijvoorbeeld door de omgevingsvariabele "LD_PRELOAD" substitueren, die niet is toegestaan in suid-programma's, en een laadproces voor zijn eigen gedeelde bibliotheek organiseren.

In de werkende exploit wordt de variabele GCONV_PATH gesubstitueerd, die wordt gebruikt om het pad naar de bibliotheek voor karakterconversie te bepalen, die dynamisch wordt geladen bij de aanroep van de functie g_printerr(), waarin iconv_open() wordt gebruikt. Door het pad in GCONV_PATH te overschrijven, kan de aanvaller voorkomen dat de standaard iconv-bibliotheek wordt geladen en in plaats daarvan zijn eigen bibliotheek laten laden, waarvan de handlers tijdens het afdrukken van een foutmelding worden uitgevoerd, terwijl pkexec nog met root-rechten draait en voordat de autorisaties voor uitvoering worden gecontroleerd.

Het wordt opgemerkt dat hoewel het probleem wordt veroorzaakt door geheugenbeschadiging, het betrouwbaar en herhaalbaar kan worden geƫxploiteerd, ongeacht de gebruikte hardware-architectuur. De voorbereide exploit is met succes getest op Ubuntu, Debian, Fedora en CentOS, maar kan ook in andere distributies worden gebruikt. De originele exploit is momenteel niet openbaar beschikbaar, wat erop wijst dat deze triviaal is en gemakkelijk door andere onderzoekers kan worden gereproduceerd, daarom is het voor multi-user systemen belangrijk om zo snel mogelijk een update met de patch te installeren. Polkit is ook beschikbaar voor BSD-systemen en Solaris, maar de mogelijkheid van exploitatie daarin is nog niet onderzocht. Het is alleen bekend dat de aanval niet kan plaatsvinden in OpenBSD, omdat de kernel van OpenBSD geen overdracht van een nulwaarde argc bij het aanroepen van execve() toestaat.

Het probleem bestaat sinds mei 2009, sinds de toevoeging van het pkexec-commando. De patch voor de kwetsbaarheid in PolKit is voorlopig beschikbaar, maar er is nog geen corrigerende release gevormd. Aangezien de ontwikkelaars van de distributies van tevoren op de hoogte zijn gesteld van het probleem, hebben de meeste distributies een update gepubliceerd op hetzelfde moment als de bekendmaking van de kwetsbaarheid. Het probleem is verholpen in RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux en Manjaro. Als tijdelijke maatregel om de kwetsbaarheid te blokkeren, kan het SUID root-vlag van het programma /usr/bin/pkexec worden verwijderd ("chmod 0755 /usr/bin/pkexec").



Bron: opennet.ru
Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster