Ang kritikal na kahinaan sa PolKit na nagpapahintulot sa root access sa karamihan ng mga distribusyon ng Linux

Natukoy ng Qualys ang isang kahinaan (CVE-2021-4034) sa bahagi ng system ng Polkit (dating PolicyKit) na ginagamit sa mga distribusyon upang payagan ang mga hindi karapat-dapat na user na magsagawa ng mga pagkilos na nangangailangan ng mataas na mga karapatan sa pag-access. Ang kahinaan ay nagbibigay-daan sa isang walang pribilehiyong lokal na gumagamit na palakihin ang kanilang mga pribilehiyo upang ma-root at makakuha ng ganap na kontrol sa system. Ang problema ay pinangalanang PwnKit at kapansin-pansin sa paggawa ng isang gumaganang pagsasamantala na tumatakbo sa default na pagsasaayos sa karamihan ng mga pamamahagi ng Linux.

Ang problema ay naroroon sa pkexec utility ng PolKit, na kasama ng SUID root flag at idinisenyo upang magpatakbo ng mga command na may mga pribilehiyo ng isa pang user ayon sa tinukoy na mga patakaran ng PolKit. Dahil sa maling pangangasiwa ng mga argumento ng command line na ipinasa sa pkexec, maaaring i-bypass ng isang walang pribilehiyong user ang pagpapatotoo at patakbuhin ang kanilang code bilang root, anuman ang itinakda ng mga panuntunan sa pag-access. Para sa isang pag-atake, hindi mahalaga kung anong mga setting at paghihigpit ang tinukoy sa PolKit, sapat na ang SUID root attribute ay nakatakda para sa executable file na may pkexec utility.

Hindi sinusuri ng Pkexec ang validity ng command line argument count (argc) na naipasa kapag nagsisimula ng isang proseso. Ipinapalagay ng mga developer ng pkexec na ang unang entry sa array ng argv ay palaging naglalaman ng pangalan ng proseso (pkexec), at ang pangalawa ay alinman sa isang NULL na halaga o ang pangalan ng command na inilunsad sa pamamagitan ng pkexec. Dahil ang bilang ng argumento ay hindi nasuri laban sa aktwal na mga nilalaman ng array at ipinapalagay na palaging mas malaki kaysa sa 1, kung ang isang proseso ay ipinasa sa isang walang laman na array ng argv, gaya ng pinapayagan ng Linux execve function, ituturing ng pkexec ang NULL bilang ang unang argumento ( ang pangalan ng proseso) at ang susunod ay nasa labas ng buffer memory, tulad ng mga kasunod na nilalaman ng array. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "program" "-option" NULL "value" "PATH=name" NULL

Ang problema ay na pagkatapos ng argv array mayroong isang envp array sa memorya na naglalaman ng mga variable ng kapaligiran. Kaya, kung walang laman ang argv array, kinukuha ng pkexec ang data tungkol sa command run na may mataas na mga pribilehiyo mula sa unang elemento ng array na may mga variable sa kapaligiran (ang argv[1] ay naging magkapareho sa envp[0]), ang mga nilalaman nito ay maaaring kontrolin. ng umaatake.

Nang matanggap ang halaga ng argv[1], sinubukan ng pkexec, na isinasaalang-alang ang mga path ng file sa PATH, upang matukoy ang buong path sa executable file at nagsusulat ng pointer sa string na may buong path pabalik sa argv[1], na humahantong sa pag-overwrite sa halaga ng unang variable ng kapaligiran, dahil ang argv[1] ay kapareho ng envp[0]. Sa pamamagitan ng pagmamanipula sa pangalan ng unang environment variable, maaaring palitan ng attacker ang isa pang environment variable sa pkexec, halimbawa, palitan ang “LD_PRELOAD” environment variable, na hindi pinapayagan sa suid programs, at ayusin para sa kanilang shared library na mai-load sa proseso.

Kasama sa working exploit ang pagpapalit sa variable na GCONV_PATH, na ginagamit upang matukoy ang path patungo sa library ng simbolo transcoding, na dynamic na na-load kapag tinatawag ang g_printerr() function, ang code na gumagamit ng iconv_open(). Sa pamamagitan ng muling pagtukoy sa path sa GCONV_PATH, matitiyak ng isang attacker na hindi ang karaniwang iconv library ang nilo-load, ngunit ang sarili nitong library, ang mga humahawak kung saan isasagawa kapag ang isang mensahe ng error ay ipinapakita sa yugto kung kailan gumagana pa rin ang pkexec. mga karapatan sa ugat at bago suriin ang mga pahintulot sa paglunsad.

Nabanggit na sa kabila ng katotohanan na ang problema ay sanhi ng katiwalian ng memorya, maaari itong mapagkakatiwalaan at paulit-ulit na pinagsamantalahan anuman ang ginamit na arkitektura ng hardware. Ang inihandang pagsasamantala ay matagumpay na nasubok sa Ubuntu, Debian, Fedora at CentOS, ngunit maaari ding gamitin sa iba pang mga distribusyon. Ang orihinal na pagsasamantala ay hindi pa magagamit sa publiko, na nagpapahiwatig na ito ay walang halaga at madaling likhain muli ng iba pang mga mananaliksik, kaya mahalagang i-install ang patch update sa lalong madaling panahon sa mga multi-user system. Available din ang Polkit para sa mga BSD system at Solaris, ngunit hindi pa pinag-aralan para magamit sa mga ito. Ang alam ay ang pag-atake ay hindi maaaring isagawa sa OpenBSD, dahil ang OpenBSD kernel ay hindi pinapayagan ang isang null argc value na maipasa kapag execve() ay tinawag.

Ang problema ay naroroon mula noong Mayo 2009, mula noong idagdag ang pkexec command. Ang pag-aayos para sa kahinaan ng PolKit ay kasalukuyang magagamit bilang isang patch (walang patch release na inilabas), ngunit dahil ang mga developer ng pamamahagi ay naabisuhan nang maaga tungkol sa problema, karamihan sa mga distribusyon ay nag-publish ng update nang sabay-sabay sa pagbubunyag ng impormasyon tungkol sa kahinaan. Naayos ang isyu sa RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux at Manjaro. Bilang pansamantalang hakbang para harangan ang kahinaan, maaari mong alisin ang SUID root flag mula sa /usr/bin/pkexec program (“chmod 0755 /usr/bin/pkexec”).



Pinagmulan: opennet.ru

Magdagdag ng komento