Linuxi tuumas avastati haavatavus (CVE-2022-0847), mis võimaldab üle kirjutada mälukahtluse sisu kõigi failide jaoks, sealhulgas ka ainult lugemisrežiimis avatud failide jaoks, mis on avatud O_RDONLY lipuga või ühendatud ainult lugemisrežiimis failisüsteemidega. Praktiliselt toob see haavatavus kaasa, et seda saab kasutada koodi sisestamiseks suvalistesse protsessidesse või failide avamise käigus andmete moonutamiseks. Näiteks on võimalik muuta authorized_keys faili sisu sshd protsessi jaoks. Testimiseks on saadaval eksploitide prototüüp.
Probleem sai koodnime Dirty Pipe, sarnaselt 2016. aastal avastatud kriitilisele haavatavusele Dirty COW. Tõdetakse, et ohu taseme poolest on Dirty Pipe samal tasemel nagu Dirty COW, kuid palju lihtsamini ära kasutatav. Haavatavus tuvastati kaebuste analüüsi käigus, mis puudutas võrgu kaudu laaditavate failide perioodilisi riknemisi süsteemis, mis laadis kokkutõmmatud arhiive logiserverist (3 kuu jooksul 37 riknemist koormatud süsteemis), mille ettevalmistamisel kasutati splice() operatsiooni ja nimetamata torusid.
Haavatavus ilmneb alates Linuxi tuumast 5.8, mis ilmus 2020. aasta augustis, st see on olemas Debian 11-s, kuid ei mõjuta Ubuntu 20.04 LTS põhituuma. RHEL 8.x ja openSUSE/SUSE 15 tuumad põhinevad algselt vanadel harudel, kuid ei saa välistada, et probleemsed muudatused on neisse tagatud (täpseid andmeid pole veel). Pakettide uuenduste avaldamise jälgimiseks distributsioonides saab kasutada järgmistel lehtedel: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Haavatavuse kõrvaldamine on pakutud versioonides 5.16.11, 5.15.25 ja 5.10.102. Parandus on samuti kaasatud Androidi platvormil kasutatavasse tuuma.
Haavatavuse põhjuseks on 'buf->flags' väärtuse initsialiseerimise puudumine copy_page_to_iter_pipe() ja push_pipe() funktsioonide koodis, arvestades, et struktuuri määramisel ei puhastata mälu ja teatud manipulatsioonide käigus nimetamata torudega võib 'buf->flags' sisaldada väärtust, mis pärineb teisest operatsioonist. Selle omaduse abil saab priviligeerimata kohalik kasutaja saavutada, et lipu väärtuseks peab 'PIPE_BUF_FLAG_CAN_MERGE', mis võimaldab andmete üle kirjutamist lehevahetuses, kirjutades lihtsalt uusi andmeid ettevalmistatud nimetamata torusse (pipe).
Ründe fail peab olema loetav, kuna toru kirjutamisel õigusi ei kontrollita, võib vahemälu asendamine toimuda ka ainult lugemiseks monteeritud osade failide suhtes (näiteks CD-ROM-i failide puhul). Pärast teabe asendamist lehe vahemälus saab protsess faili lugemisel vale, mitte tegeliku teabe.
Kasutamine seisneb nimetu toru loomises ja selle täitmises suvaliste andmetega, et saavutada PIPE_BUF_FLAG_CAN_MERGE lipu seadmine kõigis seotud ringstruktuurides. Seejärel loetakse andmed torust, kuid lipp jääb seatuks kõigis pipe_buffer ringstruktuuride eksemplarides. Seejärel kutsutakse splice() andmete lugemiseks sihtfailist nimetu torusse, alustades vajalikust nihkes. Kui andmeid sellele nimetud torule kirjutatakse, siis seatud PIPE_BUF_FLAG_CAN_MERGE lipu tõttu kirjutatakse andmed vahemälus üle, mitte ei loodud uut pipe_buffer struktuuri eksemplari.
Allikas: opennet.ru
