Podjetje Qualys je odkrilo ranljivost (CVE-2021-4034) v sistemskom komponentu Polkit (prej PolicyKit), ki se uporablja v distribucijah za omogočanje neprivilegiranim uporabnikom izvajanje dejanj, ki zahtevajo višje pravice dostopa. Ranljivost omogoča neprivilegiranemu lokalnemu uporabniku povečanje njegovih privilegijev na raven uporabnika root, kar mu omogoča popoln nadzor nad sistemom. Težava nosi kodno ime PwnKit in je pomembna zaradi priprave delujočega eksploita, ki deluje v privzetih nastavitvah v večini distribucij Linux.
Težava je prisotna v orodju pkexec, ki je del PolKit in je dostavljeno s oznako SUID root, namenjenem za izvajanje ukazov s privilegiji drugega uporabnika v skladu z določenimi pravili PolKit. Zaradi nepravilne obdelave argumentov ukazne vrstice, poslanih v pkexec, je neprivilegiran uporabnik lahko obšel avtentikacijo in dosegel izvajanje svoje kode s pravicami root, ne glede na nastavljena dostopna pravila. Za napad niso pomembne nastavitve in omejitve v PolKit, dovolj je, da ima izvršljiva datoteka orodja pkexec označeno SUID root.
Pkexec ne preverja pravilnosti števca argumentov ukazne vrstice (argc), poslanih ob zagonu procesa. Razvijalci pkexec so domnevali, da prvo vnoso v tabelo argv vedno vsebuje ime procesa (pkexec), druga pa je bodisi NULL bodisi ime ukaza, ki se izvaja prek pkexec. Ker se števec argumentov ni preverjal glede na dejansko vsebino tabele in se je domnevalo, da je vedno večji od 1, je v primeru, da se procesu pošlje prazna tabela argv, kar dopušča funkcija execve v Linuxu, pkexec obravnaval NULL kot prvi argument (ime procesa), naslednji del po meji pomnilnika pa kot preostalo vsebino tabele. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | … | argv[argc] | envp[0] | envp[1] | … | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| V V V V V V «program» «-option» NULL «value» «PATH=name» NULL
Težava je v tem, da za masivom argv v pomnilniku leži masiv envp, ki vsebuje okoljske spremenljivke. Tako, ko je masiv argv prazen, pkexec pridobi podatke o ukazu, ki se izvaja z višanimi privilegiji, iz prvega elementa masiva s okoljskimi spremenljivkami (argv[1] postane enak envp[0]), katerega vsebino lahko nadzira napadalec.
Ko pridobi vrednost argv[1], pkexec skuša ob upoštevanju datotečnih poti v PATH določiti polno pot do izvršljive datoteke in zapisati kazalec na niz s polno potjo nazaj v argv[1], kar povzroči prepisovanje prve okoljske spremenljivke, saj sta argv[1] in envp[0] enaka. Z manipulacijo z imenom prve okoljske spremenljivke lahko napadalec v pkexec vključi drugo okoljsko spremenljivko, na primer spremenljivko okolja 'LD_PRELOAD', ki ni dovoljena v suid programih, in tako organizira nalaganje svoje deljene knjižnice v proces.
V delujočem izkoriščanju se izvaja vstavitev spremenljivke GCONV_PATH, ki se uporablja za določanje poti do knjižnice za kodiranje znakov, ki se dinamično naloži pri klicu funkcije g_printerr(), v kateri se uporablja iconv_open(). Z redefiniranjem poti v GCONV_PATH lahko napadalec doseže nalaganje neobičajne knjižnice iconv, temveč svoje knjižnice, katerih obdelovalci bodo izvedeni med prikazovanjem sporočila o napaki v fazi, ko pkexec še vedno deluje s pravicami root in pred preverjanjem pooblastil za zagon.
Zabeleženo je, da, kljub temu, da je težava posledica poškodbe pomnilnika, to težavo lahko zanesljivo in ponovljivo izkoristimo ne glede na uporabljeno strojno arhitekturo. Pripravljen exploit je uspešno testiran na Ubuntu, Debian, Fedora in CentOS, vendar ga je mogoče uporabiti tudi v drugih distribucijah. Originalni exploit trenutno ni javno dostopen, kar kaže na to, da je trivialen in ga lahko enostavno ponovno ustvarijo drugi raziskovalci, zato je pri več uporabniških sistemih pomembno, da se čim prej namesti posodobitev s popravkom. Polkit je prav tako na voljo za BSD sisteme in Solaris, vendar raziskave o možnosti izkoriščanja na njih niso bile izvedene. Znano je le, da napada ni mogoče izvesti v OpenBSD, saj jedro OpenBSD ne dovoli prenosa ničelne vrednosti argc pri klicu execve().
Težava obstaja od maja 2009, ko je bila dodana ukaz pkexec. Popravilo ranljivosti v PolKit je trenutno na voljo v obliki popravka (korektivna izdaja še ni bila oblikovana), vendar so bili razvijalci distribucij vnaprej obveščeni o težavi, zato je večina distribucij objavila posodobitev 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časna rešitev za blokiranje ranljivosti lahko odstranite znak SUID root iz programa /usr/bin/pkexec ("chmod 0755 /usr/bin/pkexec").
Izvor: opennet.ru
