Kritična ranjivost u PolKitu koja dopušta root pristup na većini distribucija Linuxa

Qualys je identificirao ranjivost (CVE-2021-4034) u komponenti sustava Polkit (bivši PolicyKit) koja se koristi u distribucijama kako bi se neprivilegiranim korisnicima omogućilo izvođenje radnji koje zahtijevaju povišena prava pristupa. Ranjivost omogućuje neprivilegiranom lokalnom korisniku da poveća svoje privilegije na root i dobije potpunu kontrolu nad sustavom. Problem je imao kodni naziv PwnKit i poznat je po tome što je proizveo radni exploit koji radi u zadanoj konfiguraciji na većini distribucija Linuxa.

Problem je prisutan u PolKit-ovom uslužnom programu pkexec, koji dolazi sa SUID root oznakom i dizajniran je za pokretanje naredbi s privilegijama drugog korisnika u skladu s navedenim PolKit pravilima. Zbog neispravnog rukovanja argumentima naredbenog retka proslijeđenim pkexec-u, neprivilegirani korisnik mogao bi zaobići autentifikaciju i uzrokovati pokretanje svog koda kao root, bez obzira na postavljena pravila pristupa. Za napad nije bitno koje su postavke i ograničenja navedena u PolKit-u, dovoljno je da je SUID root atribut postavljen za izvršnu datoteku s uslužnim programom pkexec.

Pkexec ne provjerava valjanost broja argumenata naredbenog retka (argc) proslijeđenog prilikom pokretanja procesa. Programeri pkexeca pretpostavili su da prvi unos u argv polju uvijek sadrži naziv procesa (pkexec), a drugi ili NULL vrijednost ili naziv naredbe pokrenute preko pkexec. Budući da se broj argumenata nije uspoređivao sa stvarnim sadržajem niza i pretpostavljalo se da je uvijek veći od 1, ako je procesu proslijeđen prazan argv niz, kao što dopušta Linux execve funkcija, pkexec bi tretirao NULL kao prvi argument ( naziv procesa), a sljedeći kao izvan memorije međuspremnika, poput sljedećeg sadržaja niza. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "program" "-opcija" NULL "vrijednost" "PATH=name" NULL

Problem je u tome što nakon argv niza postoji envp niz u memoriji koji sadrži varijable okoline. Dakle, ako je polje argv prazno, pkexec izvlači podatke o naredbi pokrenutoj s povišenim privilegijama iz prvog elementa polja s varijablama okruženja (argv[1] je postao identičan envp[0]), čiji se sadržaj može kontrolirati od strane napadača.

Nakon što je primio vrijednost argv[1], pkexec pokušava, uzimajući u obzir staze datoteke u PATH, odrediti punu stazu do izvršne datoteke i zapisuje pokazivač na niz s punom stazom natrag na argv[1], što dovodi do prepisivanja vrijednosti prve varijable okruženja, budući da je argv[ 1] identičan envp [0]. Manipuliranjem naziva prve varijable okruženja, napadač može zamijeniti drugu varijablu okruženja u pkexec, na primjer, zamijeniti varijablu okruženja "LD_PRELOAD", koja nije dopuštena u suid programima, i organizirati da se njihova dijeljena biblioteka učita u postupak.

Radni eksploat uključuje zamjenu varijable GCONV_PATH, koja se koristi za određivanje staze do biblioteke za transkodiranje simbola, koja se dinamički učitava prilikom pozivanja funkcije g_printerr(), čiji kod koristi iconv_open(). Redefiniranjem staze u GCONV_PATH, napadač može osigurati da se ne učita standardna biblioteka iconv, već njegova vlastita biblioteka, rukovatelji iz koje će se izvršiti kada se prikaže poruka o pogrešci u fazi kada pkexec još uvijek radi s provjeravaju se root prava i dopuštenja prije pokretanja.

Napominje se da unatoč činjenici da je problem uzrokovan oštećenjem memorije, može se pouzdano i opetovano iskorištavati bez obzira na korištenu hardversku arhitekturu. Pripremljeni exploit je uspješno testiran na Ubuntuu, Debianu, Fedori i CentOS-u, ali se može koristiti i na drugim distribucijama. Izvorni exploit još nije javno dostupan, što ukazuje da je trivijalan i da ga drugi istraživači mogu lako rekreirati, stoga je važno instalirati ažuriranje zakrpe što je prije moguće na višekorisničkim sustavima. Polkit je također dostupan za BSD sustave i Solaris, ali nije proučavan za korištenje na njima. Ono što je poznato je da se napad ne može izvesti na OpenBSD, budući da OpenBSD kernel ne dopušta prosljeđivanje null argc vrijednosti kada se pozove execve().

Problem je prisutan od svibnja 2009. godine, od dodavanja naredbe pkexec. Popravak za PolKit ranjivost trenutno je dostupan kao zakrpa (nije izdano izdanje zakrpe), ali budući da su programeri distribucije bili unaprijed obaviješteni o problemu, većina distribucija je objavila ažuriranje istovremeno s otkrivanjem informacija o ranjivosti. Problem je riješen u RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux i Manjaro. Kao privremenu mjeru za blokiranje ranjivosti, možete ukloniti SUID root oznaku iz programa /usr/bin/pkexec (“chmod 0755 /usr/bin/pkexec”).



Izvor: opennet.ru

Dodajte komentar