Kritisk sårbarhed i PolKit, som giver root-adgang i de fleste Linux-distributioner.

Qualys har identificeret en sårbarhed (CVE-2021-4034) i systemkomponenten Polkit (tidligere kendt som PolicyKit), som anvendes i distributioner til at organisere udførelsen af handlinger, der kræver forhøjede rettigheder af ikke-privilegerede brugere. Sårbarheden gør det muligt for en ikke-privilegeret lokal bruger at opnå root-rettigheder og få fuld kontrol over systemet. Problemet har fået kodeordet PwnKit og er bemærkelsesværdigt for at have et fungerende arbejds-eksploit, der fungerer med standardkonfigurationer i de fleste Linux-distributioner.

Problemet findes i PolKit-værktøjet pkexec, der leveres med SUID root-flaget og er beregnet til at udføre kommandoer med en anden brugers privilegier i henhold til de angivne PolKit-regler. På grund af fejlagtig behandling af de argumenter, der sendes til pkexec via kommandolinjen, kunne en ikke-privilegeret bruger omgå autentificeringen og få sin kode kørt med root-rettigheder, uanset de fastsatte adgangsregler. For angrebet er det ligegyldigt, hvilke indstillinger og begrænsninger der er indstillet i PolKit, så længe eksekverbare filer med pkexec-værktøjet har SUID root-flaget sat.

Pkexec kontrollerer ikke gyldigheden af argumenttælleren (argc), der sendes ved starten af processen. Udviklerne af pkexec antog, at den første post i argv-arrayet altid indeholder procesnavnet (pkexec), og den anden enten en NULL-værdi eller navnet på den kommando, der køres via pkexec. Da argumenttælleren ikke blev kontrolleret mod det faktiske indhold af arrayet, og det blev antaget, at den altid var større end 1, kunne pkexec ved modtagelse af et tomt argv-array, hvilket funktionen execve i Linux tillader, opfatte NULL som det første argument (procesnavnet) og den følgende hukommelse uden for bufferet som det næste indhold i arrayet.

Problemet er, at et array envp, der indeholder miljøvariabler, placeres i hukommelsen umiddelbart efter arrayet argv. Således, når argv-arrayet er tomt, udtrækker pkexec oplysninger om den kommando, der køres med forhøjede privilegier, fra det første element i miljøvariabel-arrayet (argv[1] bliver identisk med envp[0]), hvor indholdet kan kontrolleres af en angriber.

Når pkexec har fået værdien argv[1], forsøger den at bestemme den fulde sti til den eksekverbare fil, med henblik på filveje i PATH, og skriver pegeren på strengen med den fulde sti tilbage i argv[1], hvilket fører til, at værdien af den første miljøvariabel overskrives, da argv[1] er identisk med envp[0]. Gennem manipulation af navnet på den første miljøvariabel kan angriberen indsætte en anden miljøvariabel i pkexec, for eksempel ved at indsætte miljøvariablen "LD_PRELOAD", som ikke tillades i suid-programmer, og derved organisere indlæsning af sin egen delte biblioteksfil i processen.

I det fungerende exploit foregår der en indsættelse af variablen GCONV_PATH, som bruges til at bestemme stien til det biblioteksfil for tegnkodning, som dynamisk indlæses ved kald af funktionen g_printerr(), hvor iconv_open() anvendes. Ved at omdefinere stien i GCONV_PATH kan angriberen få indlæst et ikke-standard bibliotek iconv, men sin egen biblioteksfil, hvis håndteringsrutiner vil blive udført under fejladmeldingsudskrivningen på et stadium, hvor pkexec stadig kører med root-rettigheder og før kontrol af rettighederne til udførelsen.

Det bemærkes, at selvom problemet skyldes en hukommelsesskade, kan det pålideligt og gentagne gange udnyttes uafhængigt af den anvendte hardwarearkitektur. Den forberedte exploit er blevet testet med succes på Ubuntu, Debian, Fedora og CentOS, men kan også anvendes på andre distributioner. Den originale exploit er endnu ikke offentlig tilgængelig, hvilket indikerer, at den er triviel og let kan genskabes af andre forskere, derfor er det vigtigt at installere en opdatering med en rettelse på multibruger-systemer så hurtigt som muligt. Polkit er også tilgængelig for BSD-systemer og Solaris, men muligheden for udnyttelse heri er ikke blevet undersøgt. Det vides kun, at angrebet ikke kan udføres i OpenBSD, da OpenBSD-kernen ikke tillader overførslen af nulværdien argc ved kald til execve().

Problemet har været til stede siden maj 2009, siden tilføjelsen af kommandoen pkexec. Rettelsen af sårbarheden i PolKit er endnu tilgængelig som et patch (den korrigerende version er ikke blevet dannet), men da distributionsudviklerne blev adviseret om problemet på forhånd, har de fleste distributioner offentliggjort en opdatering samtidig med afsløringen af sårbarheden. Problemet er blevet 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 SUID root-flaget fjernes fra programmet /usr/bin/pkexec (“chmod 0755 /usr/bin/pkexec”).



Kilde: opennet.ru
Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster