V jedru Linux Odkrita je bila ranljivost (CVE-2022-0847), ki omogoča prepisovanje vsebine predpomnilnika strani za katero koli datoteko, vključno s tistimi, ki so v načinu samo za branje, odprte z zastavico O_RDONLY ali se nahajajo v datotečnih sistemih, nameščenih v načinu samo za branje. V praksi je to ranljivost mogoče izkoristiti za vbrizgavanje kode v poljubne procese ali za poškodbo podatkov v odprtih datotekah. Na primer, vsebino datoteke authorized_keys za proces sshd je mogoče spremeniti. Prototip ranljivosti je na voljo za testiranje.
Težava je dobila kodno ime Dirty Pipe, kar se nanaša na kritično ranljivost Dirty COW, odkrito leta 2016. Dirty Pipe naj bi bila po resnosti enakovredna Dirty COW, vendar jo je bistveno lažje izkoristiti. Ranljivost je bila odkrita med preiskovanjem pritožb zaradi občasnega poškodovanja datotek, prenesenih prek omrežja v sistemu, ki je prenašal stisnjene arhive s strežnika dnevnikov (37 poškodb v treh mesecih na zasedenem sistemu), ki so bile pripravljene z uporabo operacije splice() in neimenovanih cevi.
Ranljivost se kaže že v jedru Linux 5.8, izdana avgusta 2020, tj. prisotna je v Debian 11, vendar ne vpliva na osnovno jedro v Ubuntu 20.04 LTS. Jedra RHEL 8.x in openSUSE/SUSE 15 so sprva temeljila na starejših vejah, vendar je možno, da je bila težava tja prenesena (natančnih podrobnosti še ni). Izdajo posodobitev paketov za te distribucije lahko spremljate na teh straneh: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch LinuxPopravek za ranljivost je na voljo 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 povzroča pomanjkanje inicializacije vrednosti »buf->flags« v funkcijah copy_page_to_iter_pipe() in push_pipe(). Pomnilnik se pri dodeljevanju strukture ne izbriše, nekatere manipulacije z neimenovanimi cevmi pa lahko povzročijo, da »buf->flags« vsebuje vrednost iz druge operacije. Z izkoriščanjem te napake lahko neprivilegiran lokalni uporabnik povzroči, da se zastavica nastavi na vrednost PIPE_BUF_FLAG_CAN_MERGE, kar omogoča prepisovanje podatkov v predpomnilniku strani s preprostim zapisovanjem novih podatkov v posebej pripravljeno neimenovano cev.
Za izvedbo napada mora biti ciljna datoteka berljiva. Ker se pravice dostopa pri pisanju v cev ne preverjajo, se lahko zamenjave predpomnilnika strani izvedejo tudi na datotekah, ki se nahajajo na particijah samo za branje (npr. datoteke s CD-ROM-a). Po zamenjavi informacij v predpomnilniku strani bo proces pri branju podatkov iz datoteke prejel zamenjane podatke, ne dejanskih.
Izkoriščanje je sestavljeno iz ustvarjanja neimenovane cevi in njenega polnjenja s poljubnimi podatki, da se v vseh povezanih obročnih strukturah nastavi zastavico PIPE_BUF_FLAG_CAN_MERGE. Podatki se nato preberejo iz cevi, 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 pri želenem odmiku. Pri pisanju podatkov v to neimenovano cev zastavica PIPE_BUF_FLAG_CAN_MERGE nastavi podatke predpomnilnika strani, da jih prepišejo, namesto da bi ustvarili nov primerek strukture pipe_buffer.
Vir: opennet.ru
