Qualys'i turbeuuringute spetsialistid avaldasid üksikasju kahe haavatavuse kohta, mis mõjutavad Linuxi tuuma ja süsteemi haldurit systemd. Tuuma haavatavus (CVE-2021-33909) võimaldab kohalikel kasutajatel saavutada root-õigustega koodi täitmine, manipuleerides sügavate kaustadega.
Haavatavuse ohtu süvendab see, et teadlastel õnnestus luua töötavad eksploidid, mis toimivad Ubuntu 20.04/20.10/21.04, Debian 11 ja Fedora 34 vaikeseadistuste puhul. Märgitakse, et teisi jaotusi ei kontrollitud, kuid neid võib teoreetiliselt samuti rünnata. Täielik eksploidide kood lubatakse avaldada pärast probleemi laialdast kõrvaldamist, kuid praegu on saadaval ainult piiratud funktsionaalsusega prototüüp, mis põhjustab süsteemi krahhi. Probleem on esinenud alates juulist 2014 ja mõjutab tuuma versioone alates 3.16. Haavatavuse parandus kooskõlastati kogukonnaga ja see võeti tuuma koosseisu 19. juulil. Peamised jaotused on juba vormindanud tuumapakettide uuendused (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).
Haavatavus tuleneb puuduvast kontrollist tüübimuutuse rezultaatide üle size_t-st int-ks enne operatsioonide tegemist seq_file koodis, mis loob faile kirje jadadest. Kontrolli puudumine võib viia mälu piiridest väljapoole kirjutamiseni, kui luuakse, monteeritakse ja kustutatakse kaustade struktuur, millel on väga suur sisetase (faili tee suurus ületab 1 GB). Lõppkokkuvõttes võib ründaja saavutada 10-baiti stringi „//deleted” kirjutamise nihkega „-2 GB — 10 bitti”, osutades piirkonnale, mis vahetult eelneb eraldatud mälule.
Ettevalmistatud eksploit vajab tööks 5 GB mälu ja 1 miljon vaba inode'i. Eksploidiga töötamine seisneb hierarhia loomises umbes miljoni sisemise kausta abil, et saavutada failitee suurus, mis ületab 1 GB. See kaust monteeritakse läbi bind-mount'i eraldi kasutajate tunne (user namespace) ja seejärel käivitatakse funktsioon rmdir() selle kustutamiseks. Samal ajal luuakse voog, mis laadib väikese eBPF programmi, mis takerdub pärast eBPF pseudokoodi kontrollimist, kuid enne JIT kompileerimist.
Privileegitamata kasutajatunne avab faili /proc/self/mountinfo ja alustab pika kausta tee lugemist, mis on monteeritud bind-mountiga, mis viib stringi „//deleted” kirjutamiseni mälupiirkonda, mis asub vahetult enne mälupilti. Kirjutamise positsioon valitakse nii, et see kirjutab üle instruktsiooni juba kontrollitud, kuid veel mitte kompileeritud eBPF programmis.
Edasi eBPF programmi tasemel muudetakse kontrollimatut kirjutamist väljapoole mälupilti hallatavaks lugemis- ja kirjutamisvõimaluseks teiste tuuma struktuuride kaudu, manipuleerides btf ja map_push_elem struktuuridega. Lõpuks määrab eksploit bufferi modprobe_path[] asukoha tuuma mälus ja kirjutab sinna tee „/sbin/modprobe”, mis võimaldab käivitada mis tahes täidetavat faili root õigustega, kui toimub request_module() kutse, mis toimub näiteks netlink soketi loomisel.
Uurijad toovad välja mitmeid kaitsemeetmeid, mis on efektiivsed ainult konkreetse eksploidiga, kuid ei kõrvalda probleemi. Soovitame seada parameeter „/proc/sys/kernel/unprivileged_userns_clone” väärtusele 0, et keelata kaustade monteerimine eraldi kasutajate tunnuses, samuti „/proc/sys/kernel/unprivileged_bpf_disabled” väärtusele 1, et keelata eBPF programmide laadimine tuuma.
On tähelepanuväärne, et analüüsides alternatiivset rünnakut, mis on seotud FUSE mehhanismi kasutamisega suure kausta monteerimiseks, sattusid teadlased veel ühe haavatavuse (CVE-2021-33910) jälile, mis mõjutab süsteemi halduri systemd. Selgus, et kui FUSE kaudu monteerida kaust, mille tee suurus ületab 8 MB, tekib haldussüsteemis initsialiseerimise protsessis (PID1) mälustress ja krahh, mis viib süsteemi „panic” seisundisse.
Probleem tuleneb sellest, et systemd jälgib ja analüüsib sisu /proc/self/mountinfo ning töötleb igat mount-punkti funktsioonis unit_name_path_escape(), kus tehakse operatsioon strdupa(), mis paigutab andmed riiulisse ega mitte dünaamiliselt eraldatud mällu. Kuna maksimumstee suurus on piiratud läbi RLIMIT_STACK, toob liiga suure mount-punkti tee töötlemine protsessi PID1 kokkuvarisemise ja süsteemi seiskumise. Rünnakuks võib kasutada lihtsat FUSE moodulit koos mitu taset süvenenud kausta mount-punktina, mille tee suurus ületab 8 MB.
Probleem ilmneb alates systemd 220-st (aprill 2015), see on juba kõrvaldatud peamises systemd repositooriumis ja kohandatud jaotustes (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). On tähelepanuväärne, et systemd 248 väljaandes eksplot ei tööta, kuna systemd koodis on viga, mis põhjustab tõrke /proc/self/mountinfo töötlemisel. Samuti on huvitav, et 2018. aastal tekkis sarnane olukord ja püüdes kirjutada exploit'i Linuxi tuuma haavatavusele CVE-2018-14634, sattusid Qualyse uurijad kolmele kriitilisele haavatavusele systemd-s.
Allikas: opennet.ru
