Linux-ytimen haavoittuvuus, joka sallii vain luku -tiedostojen vioittumisen

Linux-ytimessä (CVE-2022-0847) on havaittu haavoittuvuus, jonka avulla sivun välimuistin sisältö voidaan korvata kaikkien tiedostojen osalta, mukaan lukien vain luku -tilassa olevat, O_RDONLY-lipulla avatut tai tiedostojärjestelmissä sijaitsevat tiedostot. asennettu vain luku -tilaan. Käytännössä haavoittuvuutta voidaan käyttää koodin lisäämiseen mielivaltaisiin prosesseihin tai avattujen tiedostojen tietojen vioittamiseen. Voit esimerkiksi muuttaa sshd-prosessin authorised_keys-tiedoston sisältöä. Hyödynnyksen prototyyppi on saatavilla testattavaksi.

Ongelman koodinimi on Dirty Pipe, joka on samanlainen kuin vuonna 2016 tunnistettu Dirty COW -haavoittuvuus. On huomattava, että vaaratason suhteen Dirty Pipe on samalla tasolla kuin Dirty COW, mutta on paljon helpompi käyttää. Haavoittuvuus havaittiin analysoitaessa valituksia verkon kautta ladattujen tiedostojen säännöllisestä vioittumisesta järjestelmässä, joka lataa pakattuja arkistoja lokipalvelimelta (37 korruptiota 3 kuukaudessa ladatussa järjestelmässä), jonka valmistelussa käytettiin splice()-toimintoa. ja nimettömiä putkia.

Haavoittuvuus ilmenee elokuussa 5.8 julkaistusta Linux-ytimestä 2020 alkaen, ts. olemassa Debian 11:ssä, mutta se ei vaikuta Ubuntu 20.04 LTS:n perusytimeen. RHEL 8.x- ja openSUSE/SUSE 15-ytimet perustuvat alun perin vanhoihin haaroihin, mutta on mahdollista, että ongelman aiheuttanut muutos on takaportoitu niihin (tarkkoja tietoja ei vielä ole). Voit seurata pakettipäivitysten julkaisemista jakeluissa näillä sivuilla: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Haavoittuvuuden korjausta ehdotettiin julkaisuissa 5.16.11, 5.15.25 ja 5.10.102. Korjaus sisältyy myös Android-alustassa käytettävään ytimeen.

Haavoittuvuuden aiheuttaa se, että funktioiden copy_page_to_iter_pipe() ja push_pipe() koodissa olevaa “buf->flags”-arvoa ei ole alustettu, vaikka muistia ei tyhjennetä rakennetta varattaessa ja tiettyjen manipulaatioiden aikana. nimeämättömät putket, arvo toisesta operaatiosta. Tämän ominaisuuden avulla etuoikeutettu paikallinen käyttäjä voi saavuttaa PIPE_BUF_FLAG_CAN_MERGE-arvon näyttämisen lipussa, mikä mahdollistaa tietojen korvaamisen sivuvälimuistissa kirjoittamalla uusia tietoja erityisesti valmistettuun nimettömään putkeen.

Hyökkäyksissä kohdetiedoston on oltava luettavissa ja koska käyttöoikeuksia ei tarkisteta putkeen kirjoitettaessa, sivun välimuistissa voidaan korvata myös tiedostot, jotka sijaitsevat osioissa, jotka on asennettu vain luku -muotoon (esim tiedostoille c CD- ROM). Kun sivun välimuistissa olevat tiedot on korvattu, prosessi ei saa tietoja tiedostosta luettaessa todellista dataa, vaan korvattua dataa.

Toiminta perustuu nimettömän kanavan luomiseen ja sen täyttämiseen mielivaltaisilla tiedoilla sen varmistamiseksi, että PIPE_BUF_FLAG_CAN_MERGE-lippu on asetettu kaikkiin siihen liittyviin rengasrakenteisiin. Seuraavaksi tiedot luetaan kanavasta, mutta lippu pysyy asetettuna pipe_inode_info-rengasrakenteiden pipe_buffer-rakenteen kaikissa tapauksissa. Tämän jälkeen splice()-kutsu tehdään datan lukemiseksi kohdetiedostosta nimettömään putkeen, alkaen halutusta siirtymästä. Kun kirjoitetaan tietoja tähän nimettömään putkeen, PIPE_BUF_FLAG_CAN_MERGE-lipun asettamisen vuoksi sivun välimuistin tiedot korvataan sen sijaan, että luodaan uusi pipe_buffer-rakenteen ilmentymä.

Lähde: opennet.ru

Lisää kommentti