Kritisk sårbarhed i PolKit, der tillader root-adgang på de fleste Linux-distributioner

Qualys har identificeret en sårbarhed (CVE-2021-4034) i Polkit (tidligere PolicyKit) systemkomponent, der bruges i distributioner for at tillade uprivilegerede brugere at udføre handlinger, der kræver forhøjede adgangsrettigheder. Sårbarheden tillader en uprivilegeret lokal bruger at eskalere deres privilegier til root og få fuld kontrol over systemet. Problemet fik kodenavnet PwnKit og er kendt for at producere en fungerende udnyttelse, der kører i standardkonfigurationen på de fleste Linux-distributioner.

Problemet er til stede i PolKits pkexec-værktøj, som kommer med SUID-rodflaget og er designet til at køre kommandoer med en anden brugers privilegier i henhold til de specificerede PolKit-regler. På grund af forkert håndtering af kommandolinjeargumenter sendt til pkexec, kan en uprivilegeret bruger omgå godkendelse og få deres kode til at køre som root, uanset de indstillede adgangsregler. For et angreb er det lige meget, hvilke indstillinger og begrænsninger der er angivet i PolKit, det er nok, at SUID-rodattributten er indstillet til den eksekverbare fil med pkexec-værktøjet.

Pkexec kontrollerer ikke gyldigheden af ​​kommandolinjeargumenttællingen (argc), der er sendt, når en proces startes. Udviklerne af pkexec antog, at den første post i argv-arrayet altid indeholder navnet på processen (pkexec), og den anden enten en NULL-værdi eller navnet på den kommando, der blev lanceret via pkexec. Da argumentantallet ikke blev kontrolleret mod det faktiske indhold af arrayet og blev antaget altid at være større end 1, hvis en proces blev bestået et tomt argv-array, som Linux execve-funktionen tillader, ville pkexec behandle NULL som det første argument ( procesnavnet) og den næste som uden for bufferhukommelsen, ligesom det efterfølgende indhold af arrayet. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "program" "-option" NULL "værdi" "PATH=navn" NULL

Problemet er, at der efter argv-arrayet er en envp-array i hukommelsen, der indeholder miljøvariabler. Hvis argv-arrayet er tomt, udtrækker pkexec data om kommandoen, der køres med forhøjede privilegier fra det første element i arrayet med miljøvariabler (argv[1] blev identisk med envp[0]), hvis indhold kan kontrolleres af angriberen.

Efter at have modtaget værdien af ​​argv[1], forsøger pkexec, under hensyntagen til filstierne i PATH, at bestemme den fulde sti til den eksekverbare fil og skriver en pointer til strengen med den fulde sti tilbage til argv[1], som fører til overskrivning af værdien af ​​den første miljøvariabel, da argv[1] er identisk med envp[0]. Ved at manipulere navnet på den første miljøvariabel kan en angriber erstatte en anden miljøvariabel i pkexec, for eksempel erstatte "LD_PRELOAD" miljøvariablen, som ikke er tilladt i suid-programmer, og sørge for, at deres delte bibliotek indlæses i behandle.

Den arbejdende udnyttelse involverer erstatning af variabelen GCONV_PATH, som bruges til at bestemme stien til symbolomkodningsbiblioteket, dynamisk indlæst, når funktionen g_printerr() kaldes, hvis kode bruger iconv_open(). Ved at omdefinere stien i GCONV_PATH kan en angriber sikre, at det ikke er standard iconv-biblioteket, der indlæses, men dets eget bibliotek, hvorfra handlerne vil blive eksekveret, når en fejlmeddelelse vises på det stadie, hvor pkexec stadig kører med root-rettigheder og før start-tilladelser kontrolleres.

Det bemærkes, at på trods af, at problemet er forårsaget af hukommelseskorruption, kan det pålideligt og gentageligt udnyttes uanset den anvendte hardwarearkitektur. Den forberedte udnyttelse er med succes blevet testet på Ubuntu, Debian, Fedora og CentOS, men kan også bruges på andre distributioner. Den originale udnyttelse er endnu ikke offentlig tilgængelig, hvilket indikerer, at den er triviel og let kan genskabes af andre forskere, så det er vigtigt at installere patchopdateringen så hurtigt som muligt på flerbrugersystemer. Polkit er også tilgængelig til BSD-systemer og Solaris, men er ikke blevet undersøgt til brug på dem. Hvad man ved er, at angrebet ikke kan udføres på OpenBSD, da OpenBSD-kernen ikke tillader, at en null argc-værdi sendes, når execve() kaldes.

Problemet har været til stede siden maj 2009, siden tilføjelsen af ​​kommandoen pkexec. Rettelsen til PolKit-sårbarheden er i øjeblikket tilgængelig som en patch (der er ikke frigivet nogen patch-udgivelse), men da distributionsudviklere blev underrettet om problemet på forhånd, udgav de fleste distributioner opdateringen samtidig med offentliggørelsen af ​​oplysninger om sårbarheden. 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 en midlertidig foranstaltning til at blokere sårbarheden kan du fjerne SUID-rodflaget fra /usr/bin/pkexec-programmet ("chmod 0755 /usr/bin/pkexec").



Kilde: opennet.ru

Tilføj en kommentar