Kritična ranljivost v PolKitu, ki omogoča korenski dostop do večine distribucij Linuxa

Qualys je odkril ranljivost (CVE-2021-4034) v sistemski komponenti Polkit (prej PolicyKit), ki se uporablja v distribucijah in omogoča neprivilegiranim uporabnikom izvajanje dejanj, ki zahtevajo povišane pravice dostopa. Ranljivost omogoča neprivilegiranemu lokalnemu uporabniku, da poveča svoje privilegije na root in pridobi popoln nadzor nad sistemom. Težava je dobila kodno ime PwnKit in je znana po ustvarjanju delujočega izkoriščanja, ki se izvaja v privzeti konfiguraciji v večini distribucij Linuxa.

Težava je prisotna v pripomočku pkexec podjetja PolKit, ki je opremljen s korensko zastavico SUID in je zasnovan za izvajanje ukazov s privilegiji drugega uporabnika v skladu z določenimi pravili PolKit. Zaradi nepravilne obravnave argumentov ukazne vrstice, posredovanih pkexec, lahko neprivilegirani uporabnik zaobide preverjanje pristnosti in zažene svojo kodo kot root, ne glede na nastavljena pravila dostopa. Za napad ni pomembno, kakšne nastavitve in omejitve so določene v PolKitu, dovolj je, da je za izvršljivo datoteko s pripomočkom pkexec nastavljen korenski atribut SUID.

Pkexec ne preveri veljavnosti števila argumentov ukazne vrstice (argc), posredovanega ob zagonu procesa. Razvijalci pkexec so predpostavili, da prvi vnos v matriki argv vedno vsebuje ime procesa (pkexec), drugi pa bodisi vrednost NULL ali ime ukaza, zagnanega prek pkexec. Ker štetje argumentov ni bilo preverjeno glede na dejansko vsebino matrike in se je domnevalo, da je vedno večje od 1, bi pkexec, če bi procesu posredovali prazno matriko argv, kot omogoča funkcija Linux execve, obravnaval NULL kot prvi argument ( ime procesa) in naslednji kot zunaj vmesnega pomnilnika, kot nadaljnja vsebina polja. |———+———+——+————|———+———+——+—————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "program" "-možnost" NULL "vrednost" "PATH=name" NULL

Težava je v tem, da je za matriko argv v pomnilniku matrika envp, ki vsebuje spremenljivke okolja. Če je polje argv prazno, pkexec izvleče podatke o ukazu, zagnanem s povišanimi privilegiji, iz prvega elementa polja s spremenljivkami okolja (argv[1] je postal identičen envp[0]), katerih vsebino je mogoče nadzorovati. s strani napadalca.

Ko prejme vrednost argv[1], poskuša pkexec ob upoštevanju poti datoteke v PATH določiti celotno pot do izvršljive datoteke in zapiše kazalec na niz s celotno potjo nazaj do argv[1], kar vodi do prepisovanja vrednosti prve spremenljivke okolja, saj je argv[1] enak envp[0]. Z manipulacijo imena prve spremenljivke okolja lahko napadalec nadomesti drugo spremenljivko okolja v pkexec, na primer zamenja spremenljivko okolja »LD_PRELOAD«, ki ni dovoljena v programih suid, in uredi, da se njihova knjižnica v skupni rabi naloži v postopek.

Delovni exploit vključuje zamenjavo spremenljivke GCONV_PATH, ki se uporablja za določanje poti do knjižnice za transkodiranje simbolov, ki se dinamično naloži ob klicu funkcije g_printerr(), katere koda uporablja iconv_open(). Z redefiniranjem poti v GCONV_PATH lahko napadalec zagotovi, da ni naložena standardna knjižnica iconv, temveč njegova lastna knjižnica, iz katere bodo obdelovalci izvedeni, ko se prikaže sporočilo o napaki v fazi, ko pkexec še vedno teče z preverjene so korenske pravice in dovoljenja pred zagonom.

Opozoriti je treba, da kljub dejstvu, da je težavo povzročila okvara pomnilnika, jo je mogoče zanesljivo in večkrat izkoristiti ne glede na uporabljeno arhitekturo strojne opreme. Pripravljen exploit je bil uspešno preizkušen na Ubuntuju, Debianu, Fedori in CentOS-u, lahko pa se uporablja tudi na drugih distribucijah. Izvirni izkoristek še ni javno dostopen, kar kaže na to, da je trivialen in ga lahko drugi raziskovalci zlahka poustvarijo, zato je pomembno, da posodobitev popravka čim prej namestite v večuporabniške sisteme. Polkit je na voljo tudi za sisteme BSD in Solaris, vendar ni bil preučen za uporabo na njih. Znano je, da napada ni mogoče izvesti na OpenBSD, ker jedro OpenBSD ne dovoljuje posredovanja ničelne vrednosti argc, ko se pokliče execve().

Težava je prisotna od maja 2009, od dodajanja ukaza pkexec. Popravek za ranljivost PolKit je trenutno na voljo kot popravek (izdaja popravkov ni bila izdana), a ker so bili razvijalci distribucij vnaprej obveščeni o težavi, je večina distribucij posodobitev objavila hkrati z razkritjem informacij o ranljivosti. Težava je odpravljena v RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux in Manjaro. Kot začasen ukrep za blokiranje ranljivosti lahko odstranite korensko zastavico SUID iz programa /usr/bin/pkexec (»chmod 0755 /usr/bin/pkexec«).



Vir: opennet.ru

Dodaj komentar