Ranjivost u jezgru Linuxa koja može mijenjati datoteke samo za čitanje

Identificirana je ranjivost u jezgru Linuxa (CVE-2022-0847) koja omogućava prepisivanje sadržaja predmemorije stranice za sve datoteke, uključujući one u načinu samo za čitanje, otvorene sa zastavicom O_RDONLY ili smještene na sistemima datoteka montiran u režimu samo za čitanje. U praktičnom smislu, ranjivost bi se mogla koristiti za ubacivanje koda u proizvoljne procese ili oštećenje podataka u otvorenim datotekama. Na primjer, možete promijeniti sadržaj datoteke authorized_keys za sshd proces. Prototip eksploatacije dostupan je za testiranje.

Problem je dobio kodni naziv Dirty Pipe, slično kritičnoj ranjivosti Dirty COW identifikovanoj 2016. Napominje se da je po stepenu opasnosti Dirty Pipe na istom nivou kao Dirty COW, ali je mnogo lakši za rukovanje. Ranjivost je identifikovana tokom analize pritužbi na periodično oštećenje fajlova preuzetih preko mreže u sistemu koji preuzima komprimovane arhive sa log servera (37 oštećenja u 3 meseca na učitanom sistemu), za čiju pripremu je korišćena operacija splice() i neimenovane cijevi.

Ranjivost se pojavljuje počevši od Linux kernela 5.8, objavljenog u avgustu 2020. godine, tj. prisutan u Debianu 11, ali ne utječe na osnovnu kernel u Ubuntu 20.04 LTS. RHEL 8.x i openSUSE/SUSE 15 kerneli su inicijalno zasnovani na starim granama, ali je moguće da je promena koja je izazvala problem prebačena u njih (još nema tačnih podataka). Objavljivanje ažuriranja paketa u distribucijama možete pratiti na ovim stranicama: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Popravka za ranjivost je predložena u izdanjima 5.16.11, 5.15.25 i 5.10.102. Ispravka je također uključena u kernel koji se koristi na Android platformi.

Ranjivost je uzrokovana nedostatkom inicijalizacije vrijednosti “buf->flags” u kodu funkcija copy_page_to_iter_pipe() i push_pipe(), uprkos činjenici da se memorija ne briše prilikom dodjele strukture i tokom određenih manipulacija sa neimenovane cijevi, vrijednost iz druge operacije. Koristeći ovu funkciju, neprivilegirani lokalni korisnik može postići izgled vrijednosti PIPE_BUF_FLAG_CAN_MERGE u zastavici, što vam omogućava da organizirate prepisivanje podataka u keš stranice jednostavnim pisanjem novih podataka u posebno pripremljenu neimenovanu cijevi.

Za napad, ciljna datoteka mora biti čitljiva, a budući da se prava pristupa ne provjeravaju prilikom pisanja u kanal, zamjena u kešu stranice može se izvršiti i za datoteke koje se nalaze na particijama montiranim samo za čitanje (na primjer, za datoteke c CD- ROM). Nakon zamjene informacija u predmemoriji stranice, prilikom čitanja podataka iz datoteke, proces će primiti ne stvarne, već zamijenjene podatke.

Operacija se svodi na kreiranje neimenovanog kanala i njegovo popunjavanje proizvoljnim podacima kako bi se osiguralo da je zastavica PIPE_BUF_FLAG_CAN_MERGE postavljena u svim prstenastim strukturama koje su povezane s njim. Zatim se podaci čitaju iz kanala, ali zastavica ostaje postavljena u svim instancama pipe_buffer strukture u prstenastim strukturama pipe_inode_info. Zatim se upućuje poziv splice() za čitanje podataka iz ciljne datoteke u neimenovanu cijev, počevši od željenog pomaka. Prilikom pisanja podataka u ovu neimenovanu cijevi, zbog postavljene zastavice PIPE_BUF_FLAG_CAN_MERGE, podaci u kešu stranice će biti prepisani umjesto kreiranja nove instance pipe_buffer strukture.

izvor: opennet.ru

Dodajte komentar