Kritiese kwesbaarheid in PolKit wat worteltoegang op die meeste Linux-verspreidings moontlik maak

Qualys het 'n kwesbaarheid (CVE-2021-4034) in die Polkit (voorheen PolicyKit)-stelselkomponent wat in verspreidings gebruik word, geïdentifiseer om onbevoorregte gebruikers toe te laat om handelinge uit te voer wat verhoogde toegangsregte vereis. Die kwesbaarheid laat 'n onbevoorregte plaaslike gebruiker toe om hul voorregte te eskaleer om te wortel en volle beheer oor die stelsel te verkry. Die probleem het die kodenaam PwnKit gekry en is opmerklik vir die vervaardiging van 'n werkende uitbuiting wat in die verstekkonfigurasie op die meeste Linux-verspreidings loop.

Die probleem is teenwoordig in PolKit se pkexec-nutsding, wat saam met die SUID-wortelvlag kom en ontwerp is om opdragte uit te voer met die voorregte van 'n ander gebruiker volgens die gespesifiseerde PolKit-reëls. As gevolg van verkeerde hantering van opdragreëlargumente wat aan pkexec oorgedra is, kan 'n onbevoorregte gebruiker verifikasie omseil en hul kode as wortel laat loop, ongeag die toegangsreëls wat gestel is. Vir 'n aanval maak dit nie saak watter instellings en beperkings in PolKit gespesifiseer word nie, dit is genoeg dat die SUID-wortelkenmerk ingestel is vir die uitvoerbare lêer met die pkexec-nutsding.

Pkexec kontroleer nie die geldigheid van die opdragreël-argumenttelling (argc) wat geslaag is wanneer 'n proses begin word nie. Die ontwikkelaars van pkexec het aanvaar dat die eerste inskrywing in die argv-skikking altyd die naam van die proses (pkexec) bevat, en die tweede óf 'n NULL-waarde óf die naam van die opdrag wat via pkexec geloods is. Aangesien die argumenttelling nie teen die werklike inhoud van die skikking gekontroleer is nie en aanvaar is as altyd groter as 1, as 'n proses 'n leë argv-skikking geslaag is, soos die Linux execve-funksie dit toelaat, sal pkexec NULL as die eerste argument hanteer ( die prosesnaam) en die volgende een as buite die buffergeheue, soos die daaropvolgende inhoud van die skikking. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "program" "-opsie" NULL "waarde" "PAD=naam" NULL

Die probleem is dat daar na die argv-skikking 'n envp-skikking in die geheue is wat omgewingsveranderlikes bevat. Dus, as die argv-skikking leeg is, onttrek pkexec data oor die opdrag wat uitgevoer word met verhoogde voorregte van die eerste element van die skikking met omgewingsveranderlikes (argv[1] het identies geword aan envp[0]), waarvan die inhoud beheer kan word deur die aanvaller.

Nadat die waarde van argv[1] ontvang is, probeer pkexec, met inagneming van die lêerpaaie in PATH, om die volle pad na die uitvoerbare lêer te bepaal en skryf 'n wyser na die string met die volle pad terug na argv[1], wat lei tot die oorskryf van die waarde van die eerste omgewingsveranderlike, aangesien argv[1] identies is aan envp[0]. Deur die naam van die eerste omgewingsveranderlike te manipuleer, kan 'n aanvaller 'n ander omgewingsveranderlike in pkexec vervang, byvoorbeeld die "LD_PRELOAD" omgewingsveranderlike vervang, wat nie in suid-programme toegelaat word nie, en reël dat hul gedeelde biblioteek in die proses.

Die werkende ontginning behels die vervanging van die GCONV_PATH-veranderlike, wat gebruik word om die pad na die simbooltranskoderingsbiblioteek te bepaal, dinamies gelaai wanneer die g_printerr()-funksie geroep word, waarvan die kode iconv_open() gebruik. Deur die pad in GCONV_PATH te herdefinieer, kan 'n aanvaller verseker dat dit nie die standaard iconv-biblioteek is wat gelaai word nie, maar sy eie biblioteek, waarvan die hanteerders uitgevoer sal word wanneer 'n foutboodskap vertoon word op die stadium wanneer pkexec nog loop met wortelregte en toestemmings voor bekendstelling nagegaan word.

Daar word opgemerk dat ten spyte van die feit dat die probleem deur geheuekorrupsie veroorsaak word, dit betroubaar en herhaaldelik uitgebuit kan word, ongeag die hardeware-argitektuur wat gebruik word. Die voorbereide ontginning is suksesvol op Ubuntu, Debian, Fedora en CentOS getoets, maar kan ook op ander verspreidings gebruik word. Die oorspronklike ontginning is nog nie publiek beskikbaar nie, wat aandui dat dit triviaal is en maklik deur ander navorsers herskep kan word, daarom is dit belangrik om die pleisteropdatering so gou moontlik op veelgebruikerstelsels te installeer. Polkit is ook beskikbaar vir BSD-stelsels en Solaris, maar is nie vir gebruik daarop bestudeer nie. Wat wel bekend is, is dat die aanval nie op OpenBSD uitgevoer kan word nie, aangesien die OpenBSD kern nie toelaat dat 'n nul argc waarde deurgegee word wanneer execve() geroep word nie.

Die probleem is sedert Mei 2009 teenwoordig sedert die byvoeging van die pkexec-opdrag. Die oplossing vir die PolKit-kwesbaarheid is tans beskikbaar as 'n pleister (geen pleistervrystelling is vrygestel nie), maar aangesien verspreidingsontwikkelaars vooraf van die probleem in kennis gestel is, het die meeste verspreidings die opdatering gelyktydig gepubliseer met die bekendmaking van inligting oor die kwesbaarheid. Die probleem is opgelos in RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux en Manjaro. As 'n tydelike maatreël om die kwesbaarheid te blokkeer, kan u die SUID-wortelvlag van die /usr/bin/pkexec-program ("chmod 0755 /usr/bin/pkexec") verwyder.



Bron: opennet.ru

Voeg 'n opmerking