Juurhaavatavus Linuxi tuumas ja teenuse keelamine süsteemis Systemd

Qualysi turvateadlased on paljastanud üksikasjad kahe Linuxi tuuma ja süsteemihaldurit mõjutava haavatavuse kohta. Kerneli haavatavus (CVE-2021-33909) võimaldab kohalikul kasutajal saavutada koodi käivitamine juurõigustega, manipuleerides tugevalt pesastatud kataloogidega.

Haavatavuse ohtu suurendab tõsiasi, et teadlased suutsid valmistada ette töötavaid ärakasutusi, mis töötavad Ubuntu 20.04/20.10/21.04, Debian 11 ja Fedora 34 vaikekonfiguratsioonis. Märgitakse, et teisi distributsioone ei ole testitud, kuid need on teoreetiliselt samuti probleemile vastuvõtlikud ja neid saab rünnata. Exploitide täielik kood lubatakse avaldada pärast seda, kui probleem on kõikjal kõrvaldatud, kuid praegu on saadaval vaid piiratud funktsionaalsusega prototüüp, mis põhjustab süsteemi krahhi. Probleem on olnud alates 2014. aasta juulist ja mõjutab kerneli väljalaseid alates 3.16. Haavatavuse parandus kooskõlastati kogukonnaga ja võeti kernelisse vastu 19. juulil. Peamised distributsioonid on juba genereerinud värskendusi oma tuumapakettidele (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Haavatavuse põhjuseks on suutmatus kontrollida konverteerimise size_t tulemust int-iks enne toimingute tegemist koodiga seq_file, mis loob failid kirjete jadast. Kontrollimata jätmine võib väga pesastatud kataloogistruktuuri loomisel, ühendamisel ja kustutamisel (tee suurus üle 1 GB) kaasa tuua piiridest väljakirjutamise puhvrisse. Selle tulemusena võib ründaja saavutada 10-baidise stringi "//deleted", mis on kirjutatud nihkega "-2 GB - 10 baiti", mis osutab eraldatud puhvrile vahetult eelnevale alale.

Ettevalmistatud eksploit nõuab töötamiseks 5 GB mälu ja 1 miljonit tasuta inoodi. Exploit töötab kutsudes mkdir(), et luua umbes miljonist alamkataloogist koosnev hierarhia, et saavutada failitee suurus üle 1 GB. See kataloog ühendatakse bind-mount kaudu eraldi kasutajanimeruumi, mille järel käivitatakse selle eemaldamiseks funktsioon rmdir(). Paralleelselt luuakse lõim, mis laadib väikese eBPF-i programmi, mis blokeeritakse etapis pärast eBPF-i pseudokoodi kontrollimist, kuid enne selle JIT-i koostamist.

Privilegeerimata kasutajatunnuse nimeruumis avatakse fail /proc/self/mountinfo ja loetakse sidumisega ühendatud kataloogi pikk teenimi, mille tulemusena kirjutatakse string "//deleted" enne puhvri algust asuvasse piirkonda. Rea kirjutamise asend valitakse nii, et see kirjutab üle juba testitud, kuid veel kompileerimata eBPF programmis oleva juhise.

Järgmisena muudetakse eBPF-i programmi tasemel kontrollimatu puhvriväline kirjutamine kontrollitud võimeks lugeda ja kirjutada teistesse kerneli struktuuridesse, manipuleerides struktuure btf ja map_push_elem. Selle tulemusel määrab ärakasutamine puhvri modprobe_path[] asukoha kerneli mälus ja kirjutab selles üle tee “/sbin/modprobe”, mis võimaldab käivitada mis tahes juurõigustega käivitatava faili. request_module() kutse, mis käivitatakse näiteks netlinki sokli loomisel.

Teadlased pakuvad mitmeid lahendusi, mis on tõhusad ainult konkreetse ärakasutamise korral, kuid ei kõrvalda probleemi ennast. Soovitatav on määrata "/proc/sys/kernel/unprivileged_userns_clone" väärtuseks 0, et keelata kataloogide ühendamine eraldi kasutaja ID nimeruumis, ja "/proc/sys/kernel/unprivileged_bpf_disabled" väärtuseks 1, et keelata eBPF-programmide kernelisse laadimine.

Tähelepanuväärne on see, et analüüsides alternatiivset rünnakut, mis hõlmas FUSE mehhanismi kasutamist suure kataloogi paigaldamiseks sidumise asemel, leidsid teadlased veel ühe haavatavuse (CVE-2021-33910), mis mõjutab süsteemihaldurit. Selgus, et kui üritada FUSE kaudu ühendada kataloogi, mille tee suurus ületab 8 MB, saab juhtimise initsialiseerimisprotsessil (PID1) pinu mälu otsa ja jookseb kokku, mis paneb süsteemi “paanikasse”.

Probleem on selles, et systemd jälgib ja analüüsib faili /proc/self/mountinfo sisu ning töötleb iga ühendamispunkti funktsioonis unit_name_path_escape(), mis teostab toimingu strdupa(), mis paigutab andmed virna, mitte dünaamiliselt eraldatud mällu. . Kuna maksimaalset pinu suurust piirab RLIMIT_STACK, põhjustab liiga suure tee töötlemine ühenduspunktini PID1 protsessi krahhi ja süsteemi peatamise. Rünnakuks saate kasutada lihtsaimat FUSE moodulit koos tugevalt pesastatud kataloogi kasutamisega ühenduspunktina, mille tee suurus ületab 8 MB.

Probleem on ilmnenud alates versioonist systemd 220 (aprill 2015), see on juba parandatud peamises systemd hoidlas ja parandatud distributsioonides (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Märkimisväärne on see, et systemd versioonis 248 ei tööta ärakasutamine systemd koodi vea tõttu, mis põhjustab faili /proc/self/mountinfo töötlemise nurjumise. Huvitav on ka see, et 2018. aastal tekkis sarnane olukord ja kui üritasid Linuxi tuumas CVE-2018-14634 haavatavusele exploiti kirjutada, avastasid Qualysi teadlased systemd-is kolme kriitilise haavatavusega.

Allikas: opennet.ru

Lisa kommentaar