Linuxi tuumas avastati haavatavus (CVE-2022-0847), mis võimaldab kirjutada lehekülje vahemälu sisu mis tahes failide jaoks, sealhulgas lugemisrežiimis olevate failide, mis on avatud O_RDONLY lipuga või mountitud ainult lugemisrežiimis failisüsteemides. Praktikas võib seda haavatavust kasutada koodi sisestamiseks suvalistesse protsessidesse või avatud failide andmete moonutamiseks. Näiteks on võimalik muuta faili authorized_keys sisu protsessis sshd. Ekspluateerimise prototüüp on saadaval testimiseks.
Probleemile on antud koodnimi Dirty Pipe, paralleelselt 2016. aastal tuvastatud kriitilise haavatavusega Dirty COW. Märgitakse, et ohtlikkuse tasemelt on Dirty Pipe samal tasemel nagu Dirty COW, kuid selle ekspluateerimine on oluliselt lihtsam. Haavatavus avastati seoses kaebustega perioodiliste kahjustustega võrgu kaudu edastatud failides süsteemis, mis laadib kokku pakitud arhiive logiserverist (37 kahjustust 3 kuu jooksul ülekoormatud süsteemis), mille ettevalmistamisel kasutati splice() operatsiooni ja anonüümseid pipe'e.
Haavatavus ilmneb alates Linuxi kernist 5.8, mis ilmus 2020. aasta augustis, st see on olemas Debian 11-s, kuid ei mõjuta Ubuntu 20.04 LTS põhikernat. RHEL 8.x ja openSUSE/SUSE 15 kernelid põhinevad algselt vanadel harudel, kuid pole välistatud, et probleemiga seotud muudatus on neisse tagasi viidud (täpset teavet ei ole hetkel). Pakettide värskenduste jälgimiseks distributsioonides saab külastada järgmisi lehti: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Haavatavuse parandamine on pakutud välja versioonides 5.16.11, 5.15.25 ja 5.10.102. Parandus on samuti lisatud Androidi platvormil kasutatavasse kernasse.
Haavatavus tuleneb muutujate „buf->flags” initsialiseerimise puudumisest funktsioonides copy_page_to_iter_pipe() ja push_pipe(). Samal ajal ei puhastata mälumahtude eraldamisel struktuuri ning teatud manipuleerimise korral nimetu toru „buf->flags” väärtus võib sisaldada infot teiselt operatsioonilt. Kasutades seda omadust, võib tavakasutaja saada lipuks väärtuse PIPE_BUF_FLAG_CAN_MERGE, mis võimaldab korraldada andmete ülekirjutamist lehevahemikus lihtsa kirjutamisega uute andmete ühte spetsiaalselt ettevalmistatud nimetu torusse (pipe).
Rünnaku jaoks peab sihtfail olema loetav. Kuna torusse kirjutamisel ei kontrollita juurdepääsuõigusi, võib lehevahemikus asendamine toimuda ka failide jaoks, mis asuvad ainult lugemiseks monteeritud jagudes (näiteks CD-ROM-i failide puhul). Pärast teabe asendamist lehevahemikus saab protsess lugemisel mitte tegelikke, vaid valeandmeid.
Kasutamine seisneb nimetu kanali loomises ja selle täitmises juhuslike andmetega, et saavutada PIPE_BUF_FLAG_CAN_MERGE lipu seadmine kõigis seotud ringstruktuurides. Seejärel loetakse andmed kanalist, kuid lipp jääb seatuks kõigis pipe_buffer struktuuri eksemplarides ringstruktuurides pipe_inode_info. Seejärel kutsutakse välja splice() andmete lugemiseks sihtfailist nimetusse kanalisse alates vajalikust asukohast. Kui andmeid kirjutatakse sellesse nimetusse kanali pärast seadistatud PIPE_BUF_FLAG_CAN_MERGE lippu, siis andmed lehe vahemikus kirjutatakse üle, selle asemel et luua uus pipe_buffer struktuuri eksemplar.
Allikas: opennet.ru
