Ranljivost v jedru Linuxa, ki omogoča poškodovanje datotek samo za branje

V jedru Linuxa (CVE-2022-0847) je bila ugotovljena ranljivost, ki omogoča prepisovanje vsebine predpomnilnika strani za vse datoteke, vključno s tistimi v načinu samo za branje, odprtimi z zastavico O_RDONLY ali v datotečnih sistemih nameščen v načinu samo za branje. V praksi bi lahko ranljivost uporabili za vbrizgavanje kode v poljubne procese ali za poškodovanje podatkov v odprtih datotekah. Na primer, lahko spremenite vsebino datoteke authorized_keys za proces sshd. Prototip izkoriščanja je na voljo za testiranje.

Težava je dobila kodno ime Dirty Pipe, podobno kot kritična ranljivost Dirty COW, ugotovljena leta 2016. Opozoriti je treba, da je Dirty Pipe glede stopnje nevarnosti na enaki ravni kot Dirty COW, vendar je veliko lažji za upravljanje. Ranljivost je bila ugotovljena med analizo pritožb o občasnih poškodbah datotek, prenesenih preko omrežja v sistemu, ki prenaša stisnjene arhive s strežnika dnevnikov (37 poškodb v 3 mesecih na obremenjenem sistemu), za pripravo katerih je bila uporabljena operacija splice(). in neimenovane cevi.

Ranljivost se pojavi od jedra Linuxa 5.8, izdanega avgusta 2020, tj. prisoten v Debianu 11, vendar ne vpliva na osnovno jedro v Ubuntu 20.04 LTS. Jedra RHEL 8.x in openSUSE/SUSE 15 prvotno temeljita na starih vejah, vendar je možno, da je bila sprememba, ki povzroča težavo, prenesena vanje (natančnih podatkov še ni). Objavo posodobitev paketov v distribucijah lahko spremljate na teh straneh: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Popravek za ranljivost je bil predlagan v izdajah 5.16.11, 5.15.25 in 5.10.102. Popravek je vključen tudi v jedro, ki se uporablja v platformi Android.

Ranljivost je posledica pomanjkanja inicializacije vrednosti »buf->flags« v kodi funkcij copy_page_to_iter_pipe() in push_pipe(), kljub dejstvu, da se pomnilnik ne izbriše pri dodeljevanju strukture in med določenimi manipulacijami z neimenovane cevi, vrednost iz druge operacije. Z uporabo te funkcije lahko neprivilegirani lokalni uporabnik doseže videz vrednosti PIPE_BUF_FLAG_CAN_MERGE v zastavici, kar vam omogoča organiziranje prepisovanja podatkov v predpomnilniku strani s preprostim zapisovanjem novih podatkov v posebej pripravljeno neimenovano cev.

Za napad mora biti ciljna datoteka berljiva, in ker se pravice dostopa ne preverjajo pri pisanju v cev, se lahko zamenjava v predpomnilniku strani izvede tudi za datoteke, ki se nahajajo na particijah, nameščenih samo za branje (na primer za datoteke c CD- ROM). Po zamenjavi informacij v predpomnilniku strani pri branju podatkov iz datoteke proces ne bo prejel dejanskih podatkov, temveč zamenjane podatke.

Delovanje se zmanjša na ustvarjanje neimenovanega kanala in njegovo polnjenje s poljubnimi podatki, da se zagotovi, da je zastavica PIPE_BUF_FLAG_CAN_MERGE nastavljena v vseh z njim povezanih obročnih strukturah. Nato se podatki preberejo iz kanala, vendar zastavica ostane nastavljena v vseh primerkih strukture pipe_buffer v obročnih strukturah pipe_inode_info. Nato se izvede klic splice() za branje podatkov iz ciljne datoteke v neimenovano cev, začenši z želenim odmikom. Pri zapisovanju podatkov v to neimenovano cev bodo zaradi nastavljene zastavice PIPE_BUF_FLAG_CAN_MERGE podatki v predpomnilniku strani prepisani namesto ustvarjanja novega primerka strukture pipe_buffer.

Vir: opennet.ru

Dodaj komentar