Kritisk sårbarhet i PolKit som tillater root-tilgang på de fleste Linux-distribusjoner

Qualys har identifisert en sårbarhet (CVE-2021-4034) i systemkomponenten Polkit (tidligere PolicyKit) som brukes i distribusjoner for å tillate uprivilegerte brukere å utføre handlinger som krever økte tilgangsrettigheter. Sårbarheten lar en uprivilegert lokal bruker eskalere privilegiene sine til å roote og få full kontroll over systemet. Problemet fikk kodenavnet PwnKit og er kjent for å produsere en fungerende utnyttelse som kjører i standardkonfigurasjonen på de fleste Linux-distribusjoner.

Problemet er tilstede i PolKits pkexec-verktøy, som kommer med SUID-rotflagget og er designet for å kjøre kommandoer med rettighetene til en annen bruker i henhold til de spesifiserte PolKit-reglene. På grunn av feil håndtering av kommandolinjeargumenter sendt til pkexec, kan en uprivilegert bruker omgå autentisering og kjøre koden som root, uavhengig av tilgangsreglene som er satt. For et angrep spiller det ingen rolle hvilke innstillinger og restriksjoner som er spesifisert i PolKit, det er nok at SUID-rotattributtet er satt for den kjørbare filen med pkexec-verktøyet.

Pkexec sjekker ikke gyldigheten til kommandolinjeargumenttellingen (argc) som ble sendt når en prosess startes. Utviklerne av pkexec antok at den første oppføringen i argv-matrisen alltid inneholder navnet på prosessen (pkexec), og den andre enten en NULL-verdi eller navnet på kommandoen som ble lansert via pkexec. Siden argumenttellingen ikke ble sjekket mot det faktiske innholdet i matrisen og ble antatt å være alltid større enn 1, hvis en prosess ble bestått en tom argv-matrise, som Linux execve-funksjonen tillater, vil pkexec behandle NULL som det første argumentet ( prosessnavnet) og den neste som utenfor bufferminnet, som det påfølgende innholdet i matrisen. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "program" "-opsjon" NULL "verdi" "PATH=navn" NULL

Problemet er at etter argv-matrisen er det en envp-matrise i minnet som inneholder miljøvariabler. Hvis argv-matrisen er tom, trekker pkexec ut data om kommandoen som kjøres med forhøyede rettigheter fra det første elementet i matrisen med miljøvariabler (argv[1] ble identisk med envp[0]), hvis innhold kan kontrolleres av angriperen.

Etter å ha mottatt verdien av argv[1], prøver pkexec, tatt i betraktning filbanene i PATH, å bestemme hele banen til den kjørbare filen og skriver en peker til strengen med hele banen tilbake til argv[1], som fører til overskriving av verdien til den første miljøvariabelen, siden argv[1] er identisk med envp[0]. Ved å manipulere navnet på den første miljøvariabelen, kan en angriper erstatte en annen miljøvariabel i pkexec, for eksempel erstatte "LD_PRELOAD" miljøvariabelen, som ikke er tillatt i suid-programmer, og sørge for at deres delte bibliotek lastes inn i prosess.

Arbeidsutnyttelsen innebærer å erstatte GCONV_PATH-variabelen, som brukes til å bestemme banen til symbolomkodingsbiblioteket, dynamisk lastet når du kaller g_printerr()-funksjonen, hvis kode bruker iconv_open(). Ved å redefinere banen i GCONV_PATH, kan en angriper sikre at det ikke er standard iconv-biblioteket som lastes, men dets eget bibliotek, som behandlerne vil bli utført fra når en feilmelding vises på stadiet når pkexec fortsatt kjører med rotrettigheter og tillatelser før lansering kontrolleres.

Det bemerkes at til tross for at problemet er forårsaket av minnekorrupsjon, kan det brukes pålitelig og gjentatte ganger uavhengig av maskinvarearkitekturen som brukes. Den forberedte utnyttelsen har blitt testet på Ubuntu, Debian, Fedora og CentOS, men kan også brukes på andre distribusjoner. Den originale utnyttelsen er ennå ikke offentlig tilgjengelig, noe som indikerer at den er triviell og lett kan gjenskapes av andre forskere, så det er viktig å installere patchoppdateringen så snart som mulig på flerbrukersystemer. Polkit er også tilgjengelig for BSD-systemer og Solaris, men har ikke blitt studert for bruk på dem. Det som er kjent er at angrepet ikke kan utføres på OpenBSD, siden OpenBSD-kjernen ikke tillater at en null argc-verdi sendes når execve() kalles.

Problemet har vært tilstede siden mai 2009, siden pkexec-kommandoen ble lagt til. Rettingen for PolKit-sårbarheten er for øyeblikket tilgjengelig som en oppdatering (ingen oppdateringsutgivelse er utgitt), men siden distribusjonsutviklere ble varslet om problemet på forhånd, publiserte de fleste distribusjoner oppdateringen samtidig med avsløringen av informasjon om sårbarheten. Problemet er løst i RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux og Manjaro. Som et midlertidig tiltak for å blokkere sårbarheten, kan du fjerne SUID-rotflagget fra /usr/bin/pkexec-programmet ("chmod 0755 /usr/bin/pkexec").



Kilde: opennet.ru

Legg til en kommentar