Päähaavoittuvuus Linux-ytimessä ja palvelunesto systemd:ssä

Qualysin tietoturvatutkijat ovat paljastaneet yksityiskohtia kahdesta haavoittuvuudesta, jotka vaikuttavat Linux-ytimeen ja systemd-järjestelmänhallintaan. Ytimen haavoittuvuus (CVE-2021-33909) mahdollistaa sen, että paikallinen käyttäjä voi suorittaa koodin pääkäyttäjän oikeuksin manipuloimalla erittäin sisäkkäisiä hakemistoja.

Haavoittuvuuden vaaraa pahentaa se, että tutkijat pystyivät valmistamaan toimivia hyväksikäyttöjä, jotka toimivat Ubuntu 20.04/20.10/21.04, Debian 11 ja Fedora 34 oletuskokoonpanoissa. On huomattava, että muita jakeluja ei ole testattu, mutta ne ovat teoriassa myös herkkiä ongelmalle ja niihin voidaan hyökätä. Hyökkäysten täydellinen koodi on luvattu julkaista, kun ongelma on poistettu kaikkialta, mutta toistaiseksi saatavilla on vain rajoitettu toiminnallisuus prototyyppi, joka aiheuttaa järjestelmän kaatumisen. Ongelma on ollut olemassa heinäkuusta 2014 lähtien ja se vaikuttaa ytimen julkaisuihin 3.16 alkaen. Haavoittuvuuden korjaus koordinoitiin yhteisön kanssa ja hyväksyttiin ytimeen 19. heinäkuuta. Tärkeimmät jakelut ovat jo luoneet päivitykset ydinpaketteihinsa (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Haavoittuvuus johtuu siitä, että size_t muunnoksen tulosta int:ksi ei tarkisteta ennen toimintojen suorittamista seq_file-koodissa, joka luo tiedostoja tietuesarjasta. Jos tarkistus epäonnistuu, puskuriin voi kirjoittaa rajojen ulkopuolella, kun luodaan, liitetään ja poistetaan erittäin sisäkkäistä hakemistorakennetta (polun koko on yli 1 Gt). Tämän seurauksena hyökkääjä voi saavuttaa 10-tavuisen merkkijonon "//deleted", joka on kirjoitettu poikkeuksella "-2 GB - 10 tavua", joka osoittaa varattua puskuria välittömästi edeltävälle alueelle.

Valmisteltu hyväksikäyttö vaatii toimiakseen 5 Gt muistia ja miljoona ilmaista inodia. Hyödyntäminen toimii kutsumalla mkdir() luodakseen noin miljoonan alihakemiston hierarkian, jotta tiedostopolun koko ylittää 1 Gt. Tämä hakemisto liitetään bind-mount-toiminnolla erilliseen käyttäjän nimiavaruuteen, jonka jälkeen rmdir()-funktio suoritetaan sen poistamiseksi. Samanaikaisesti luodaan säie, joka lataa pienen eBPF-ohjelman, joka estetään vaiheessa eBPF-pseudokoodin tarkistamisen jälkeen, mutta ennen sen JIT-kääntämistä.

Etuoikeudettoman käyttäjätunnuksen nimiavaruudessa avataan tiedosto /proc/self/mountinfo ja luetaan sidotun hakemiston pitkä polkunimi, jolloin merkkijono "//deleted" kirjoitetaan alueelle ennen puskurin alkua. Rivin kirjoituspaikka valitaan siten, että se korvaa käskyn jo testatussa, mutta ei vielä käännetyssä eBPF-ohjelmassa.

Seuraavaksi eBPF-ohjelmatasolla hallitsematon puskurin ulkopuolinen kirjoittaminen muunnetaan ohjatuksi kyvyksi lukea ja kirjoittaa muihin ydinrakenteisiin manipuloimalla btf- ja map_push_elem-rakenteita. Tämän seurauksena hyväksikäyttö määrittää modprobe_path[]-puskurin sijainnin ytimen muistissa ja korvaa siinä olevan "/sbin/modprobe"-polun, mikä mahdollistaa minkä tahansa suoritettavan tiedoston käynnistämisen pääkäyttäjän oikeuksilla, jos request_module() -kutsu, joka suoritetaan esimerkiksi luotaessa netlink-sockettia.

Tutkijat tarjoavat useita kiertotapoja, jotka ovat tehokkaita vain tietylle hyväksikäytölle, mutta eivät poista itse ongelmaa. On suositeltavaa asettaa "/proc/sys/kernel/unprivileged_userns_clone" arvoksi 0, jos haluat poistaa hakemistojen liittämisen käytöstä erillisessä käyttäjätunnuksen nimiavaruudessa, ja "/proc/sys/kernel/unprivileged_bpf_disabled" arvoksi 1, jos haluat estää eBPF-ohjelmien lataamisen ytimeen.

On huomionarvoista, että analysoidessaan vaihtoehtoista hyökkäystä, joka sisälsi FUSE-mekanismin käytön suuren hakemiston asentamisen sijasta bind-moundin sijaan, tutkijat löysivät toisen haavoittuvuuden (CVE-2021-33910), joka vaikutti systemd-järjestelmänhallintaan. Kävi ilmi, että yritettäessä liittää hakemistoa, jonka polun koko on yli 8 MB FUSE:n kautta, ohjausalustuksen (PID1) pinomuisti loppuu ja se kaatuu, mikä asettaa järjestelmän "paniikki"-tilaan.

Ongelmana on, että systemd seuraa ja jäsentää tiedoston /proc/self/mountinfo sisältöä ja käsittelee jokaisen liitoskohdan unit_name_path_escape()-funktiossa, joka suorittaa strdupa()-toiminnon, joka sijoittaa tiedot pinoon dynaamisesti varatun muistin sijaan. . Koska RLIMIT_STACK rajoittaa pinon enimmäiskokoa, liian suuren polun käsittely liitoskohtaan aiheuttaa PID1-prosessin kaatumisen ja järjestelmän pysäyttämisen. Hyökkäyksissä voit käyttää yksinkertaisinta FUSE-moduulia yhdistettynä erittäin sisäkkäiseen hakemistoon liitoskohtana, jonka polun koko ylittää 8 Mt.

Ongelma on ilmennyt systemd 220:sta lähtien (huhtikuu 2015), se on jo korjattu systemd-päävarastossa ja korjattu jakeluissa (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Erityisesti systemd-julkaisussa 248 hyväksikäyttö ei toimi systemd-koodin virheen vuoksi, joka aiheuttaa /proc/self/mountinfo-tiedoston käsittelyn epäonnistumisen. On myös mielenkiintoista, että vuonna 2018 syntyi samanlainen tilanne ja yrittäessään kirjoittaa hyväksikäyttöä Linux-ytimen CVE-2018-14634-haavoittuvuuteen Qualys-tutkijat löysivät kolme kriittistä haavoittuvuutta systemdissä.

Lähde: opennet.ru

Lisää kommentti