Kritinis „PolKit“ pažeidžiamumas, suteikiantis pagrindinę prieigą prie daugelio „Linux“ platinimų

Qualys nustatė pažeidžiamumą (CVE-2021-4034) Polkit (anksčiau PolicyKit) sistemos komponente, naudojamoje platinimuose, kad neprivilegijuoti vartotojai galėtų atlikti veiksmus, kuriems reikalingos padidintos prieigos teisės. Pažeidžiamumas leidžia neprivilegijuotam vietiniam vartotojui išplėsti savo teises ir įgyti visišką sistemos kontrolę. Problema buvo pavadinta kodiniu pavadinimu PwnKit ir pastebima tuo, kad buvo sukurtas veikiantis išnaudojimas, kuris veikia pagal numatytąją konfigūraciją daugelyje Linux platinimų.

Problema yra „PolKit“ programoje „pkexec“, kuri pateikiama su SUID šaknies vėliava ir yra skirta paleisti komandas su kito vartotojo teisėmis pagal nurodytas „PolKit“ taisykles. Dėl netinkamo pkexec perduodamų komandinės eilutės argumentų tvarkymo, neprivilegijuotas vartotojas gali apeiti autentifikavimą ir priversti savo kodą paleisti kaip root, nepaisant nustatytų prieigos taisyklių. Atakai nesvarbu, kokie nustatymai ir apribojimai nurodyti PolKit, pakanka, kad vykdomajam failui būtų nustatytas SUID root atributas su pkexec programa.

Pkexec netikrina komandinės eilutės argumentų skaičiaus (argc), perduodamo pradedant procesą, galiojimo. Pkexec kūrėjai manė, kad pirmame argv masyvo įraše visada yra proceso pavadinimas (pkexec), o antrajame - NULL reikšmė arba komandos, paleistos per pkexec, pavadinimas. Kadangi argumentų skaičius nebuvo patikrintas pagal tikrąjį masyvo turinį ir buvo manoma, kad jis visada didesnis nei 1, jei procesui buvo perduodamas tuščias argv masyvas, kaip leidžia Linux execve funkcija, pkexec NULL traktuos kaip pirmąjį argumentą ( proceso pavadinimas), o kitas – už buferinės atminties ribų, kaip ir tolesnis masyvo turinys. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "programa" "-parinktis" NULL "reikšmė" "PATH=vardas" NULL

Problema ta, kad po argv masyvo atmintyje yra envp masyvas, kuriame yra aplinkos kintamųjų. Taigi, jei argv masyvas tuščias, pkexec iš pirmojo masyvo elemento su aplinkos kintamaisiais ištraukia duomenis apie komandą, vykdomą su padidintomis teisėmis (argv[1] tapo identiška envp[0]), kurios turinį galima valdyti užpuoliko.

Gavęs argv[1] reikšmę, pkexec, atsižvelgdamas į failo kelius PATH, bando nustatyti visą vykdomojo failo kelią ir įrašo žymeklį į eilutę su visu keliu atgal į argv[1], kuris veda prie pirmojo aplinkos kintamojo vertės perrašymo, nes argv[1] yra identiškas envp[0]. Manipuliuodamas pirmojo aplinkos kintamojo pavadinimu, užpuolikas gali pakeisti pkexec aplinkos kintamąjį kitu, pavyzdžiui, pakeisti aplinkos kintamąjį „LD_PRELOAD“, kuris neleidžiamas suid programose, ir pasirūpinti, kad jų bendra biblioteka būtų įkelta į procesas.

Darbinis išnaudojimas apima kintamąjį GCONV_PATH, kuris naudojamas nustatyti kelią į simbolių perkodavimo biblioteką, dinamiškai įkeliamą iškviečiant funkciją g_printerr(), kurios kodas naudoja iconv_open(). Iš naujo apibrėždamas kelią GCONV_PATH, užpuolikas gali užtikrinti, kad būtų įkelta ne standartinė iconv biblioteka, o jo paties biblioteka, kurios tvarkyklės bus vykdomos, kai bus rodomas klaidos pranešimas, kai pkexec vis dar veikia su root teisės ir prieš paleidimo leidimai yra patikrinti.

Pažymima, kad nepaisant to, kad problemą sukelia atminties sugadinimas, ją galima patikimai ir pakartotinai išnaudoti nepriklausomai nuo naudojamos aparatinės įrangos architektūros. Paruoštas išnaudojimas buvo sėkmingai išbandytas Ubuntu, Debian, Fedora ir CentOS, tačiau gali būti naudojamas ir kituose platinimuose. Pradinis išnaudojimas dar nėra viešai prieinamas, o tai rodo, kad jis yra trivialus ir gali būti lengvai atkurtas kitų tyrinėtojų, todėl svarbu kuo greičiau įdiegti pataisos naujinimą kelių vartotojų sistemose. „Polkit“ taip pat galima naudoti BSD sistemoms ir „Solaris“, bet nebuvo ištirtas, kaip jose naudoti. Yra žinoma, kad ataka negali būti įvykdyta naudojant OpenBSD, nes OpenBSD branduolys neleidžia perduoti nulinės argc reikšmės, kai iškviečiamas execve().

Problema kilo nuo 2009 m. gegužės mėn., kai buvo pridėta komanda pkexec. „PolKit“ pažeidžiamumo pataisa šiuo metu pasiekiama kaip pataisa (neišleistas joks pataisos leidimas), tačiau kadangi platinimo kūrėjai buvo iš anksto informuoti apie problemą, dauguma platintojų naujinimą paskelbė kartu su informacija apie pažeidžiamumą. Problema išspręsta RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux ir Manjaro. Kaip laikiną pažeidžiamumo blokavimo priemonę galite pašalinti SUID šakninę vėliavėlę iš /usr/bin/pkexec programos („chmod 0755 /usr/bin/pkexec“).



Šaltinis: opennet.ru

Добавить комментарий