Kritična ranjivost u PolKit-u omogućava root pristup na većini Linux distribucija

Qualys je identifikovao ranjivost (CVE-2021-4034) u komponenti sistema Polkit (ranije PolicyKit) koja se koristi u distribucijama kako bi se omogućilo neprivilegovanim korisnicima da izvode radnje koje zahtevaju povišena prava pristupa. Ranjivost omogućava neprivilegovanom lokalnom korisniku da eskalira svoje privilegije na root i stekne potpunu kontrolu nad sistemom. Problem je dobio kodni naziv PwnKit i značajan je po stvaranju radnog exploit-a koji radi u zadanoj konfiguraciji na većini Linux distribucija.

Problem je prisutan u PolKit-ovom pkexec uslužnom programu, koji dolazi sa SUID root zastavicom i dizajniran je za pokretanje komandi s privilegijama drugog korisnika prema specificiranim PolKit pravilima. Zbog netačnog rukovanja argumentima komandne linije proslijeđenim pkexec-u, neprivilegirani korisnik mogao bi zaobići autentifikaciju i pokrenuti svoj kod kao root, bez obzira na postavljena pravila pristupa. Za napad, nije važno koja su podešavanja i ograničenja navedena u PolKit-u, dovoljno je da je SUID root atribut postavljen za izvršnu datoteku pomoću pkexec uslužnog programa.

Pkexec ne provjerava valjanost broja argumenata komandne linije (argc) proslijeđenog prilikom pokretanja procesa. Programeri pkexec-a pretpostavili su da prvi unos u nizu argv uvijek sadrži ime procesa (pkexec), a drugi ili NULL vrijednost ili ime naredbe pokrenute putem pkexec-a. Budući da se broj argumenata nije provjeravao u odnosu na stvarni sadržaj niza i pretpostavljalo se da je uvijek veći od 1, ako je procesu proslijeđen prazan argv niz, kao što to dozvoljava Linux execve funkcija, pkexec bi tretirao NULL kao prvi argument ( ime procesa) i sljedeći kao izvan memorije bafera, poput naknadnog sadržaja niza. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "program" "-opcija" NULL "vrijednost" "PATH=ime" NULL

Problem je što nakon argv niza postoji envp niz u memoriji koji sadrži varijable okruženja. Dakle, ako je argv niz prazan, pkexec izdvaja podatke o naredbi koja se izvodi s povišenim privilegijama iz prvog elementa niza sa varijablama okruženja (argv[1] postao je identičan envp[0]), čiji se sadržaj može kontrolisati od strane napadača.

Nakon što je primio vrijednost argv[1], pkexec pokušava, uzimajući u obzir putanje datoteke u PATH, odrediti punu putanju do izvršne datoteke i upisuje pokazivač na niz s punom putanjom natrag do argv[1], što dovodi do prepisivanja vrijednosti prve varijable okruženja, pošto je argv[1] identičan envp[0]. Manipulirajući imenom prve varijable okruženja, napadač može zamijeniti drugu varijablu okruženja u pkexec-u, na primjer, zamijeniti varijablu okruženja “LD_PRELOAD”, što nije dozvoljeno u suid programima, i organizirati da se njihova zajednička biblioteka učita u proces.

Radni eksploat uključuje zamjenu varijable GCONV_PATH, koja se koristi za određivanje putanje do biblioteke za transkodiranje simbola, koja se dinamički učitava prilikom poziva funkcije g_printerr(), čiji kod koristi iconv_open(). Redefiniranjem putanje u GCONV_PATH, napadač može osigurati da nije učitana standardna biblioteka iconv, već njegova vlastita biblioteka, rukovatelji iz koje će se izvršiti kada se prikaže poruka o grešci u fazi kada pkexec još uvijek radi sa root prava i dozvole prije pokretanja su provjerene.

Napominje se da uprkos činjenici da je problem uzrokovan oštećenjem memorije, on se može pouzdano i ponovljeno eksploatisati bez obzira na korištenu hardversku arhitekturu. Pripremljeni exploit je uspješno testiran na Ubuntu, Debianu, Fedori i CentOS-u, ali se može koristiti i na drugim distribucijama. Originalni exploit još nije javno dostupan, što ukazuje da je trivijalan i da ga drugi istraživači mogu lako ponovo kreirati, tako da je važno instalirati ažuriranje zakrpe što je prije moguće na višekorisničkim sistemima. Polkit je takođe dostupan za BSD sisteme i Solaris, ali nije proučavan za upotrebu na njima. Ono što je poznato je da se napad ne može izvesti na OpenBSD, pošto OpenBSD kernel ne dozvoljava da se null argc vrijednost prenese kada se pozove execve().

Problem je prisutan od maja 2009. godine, od dodavanja naredbe pkexec. Ispravka za PolKit ranjivost je trenutno dostupna kao zakrpa (nije objavljeno nijedno 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 meru za blokiranje ranjivosti, možete ukloniti SUID root zastavicu iz /usr/bin/pkexec programa (“chmod 0755 /usr/bin/pkexec”).



izvor: opennet.ru

Dodajte komentar