Linux kodola ievainojamība, kas ļauj sabojāt tikai lasāmus failus

Linux kodolā (CVE-2022-0847) ir konstatēta ievainojamība, kas ļauj pārrakstīt lapas kešatmiņas saturu jebkuriem failiem, tostarp tiem, kas ir tikai lasīšanas režīmā, ir atvērti ar karogu O_RDONLY vai atrodas failu sistēmās. uzstādīts tikai lasīšanas režīmā. Praktiski ievainojamību var izmantot, lai ievietotu kodu patvaļīgos procesos vai bojātu datus atvērtajos failos. Piemēram, varat mainīt sshd procesa faila authorised_keys saturu. Ekspluatācijas prototips ir pieejams testēšanai.

Problēmas kodētais nosaukums ir Dirty Pipe, līdzīgi kā 2016. gadā konstatētā kritiskā ievainojamība Dirty COW. Jāatzīmē, ka bīstamības līmeņa ziņā Dirty Pipe ir vienā līmenī ar Dirty COW, taču ir daudz vieglāk darbināms. Ievainojamība tika konstatēta, analizējot sūdzības par periodiskiem tīklā lejupielādēto failu bojājumiem sistēmā, kas lejupielādē saspiestus arhīvus no žurnāla servera (37 bojājumi 3 mēnešos ielādētā sistēmā), kuru sagatavošanā tika izmantota operācija splice() un nenosauktas caurules.

Ievainojamība parādās, sākot ar Linux kodolu 5.8, kas tika izlaists 2020. gada augustā, t.i. atrodas Debian 11, bet neietekmē Ubuntu 20.04 LTS bāzes kodolu. RHEL 8.x un openSUSE/SUSE 15 kodoli sākotnēji ir balstīti uz veciem zariem, taču iespējams, ka izmaiņas, kas izraisīja problēmu, tika pārnestas uz tiem (precīzu datu vēl nav). Varat izsekot pakotņu atjauninājumu publicēšanai izplatījumos šajās lapās: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Ievainojamības labojums tika piedāvāts laidienos 5.16.11, 5.15.25 un 5.10.102. Labojums ir iekļauts arī Android platformā izmantotajā kodolā.

Ievainojamību izraisa “buf->flags” vērtības inicializācijas trūkums funkciju copy_page_to_iter_pipe() un push_pipe() kodā, neskatoties uz to, ka atmiņa netiek notīrīta, piešķirot struktūru un veicot noteiktas manipulācijas ar nenosauktas caurules, vērtība no citas darbības. Izmantojot šo funkciju, nepievilcīgs vietējais lietotājs var panākt PIPE_BUF_FLAG_CAN_MERGE vērtības parādīšanos karodziņā, kas ļauj organizēt datu pārrakstīšanu lapas kešatmiņā, vienkārši ierakstot jaunus datus speciāli sagatavotā beznosaukuma caurulē.

Uzbrukumam mērķa failam ir jābūt lasāmam, un, tā kā piekļuves tiesības netiek pārbaudītas, rakstot caurulē, lapas kešatmiņā var aizstāt arī failus, kas atrodas nodalījumos, kas ir uzstādīti tikai lasāmā režīmā (piemēram, failiem c CD- ROM). Pēc informācijas aizstāšanas lapas kešatmiņā, nolasot datus no faila, process saņems nevis faktiskos, bet gan aizstātos datus.

Darbība ir saistīta ar nenosaukta kanāla izveidi un tā aizpildīšanu ar patvaļīgiem datiem, lai nodrošinātu, ka karodziņš PIPE_BUF_FLAG_CAN_MERGE ir iestatīts visās ar to saistītajās gredzenu struktūrās. Pēc tam dati tiek nolasīti no kanāla, bet karodziņš paliek iestatīts visos pipe_buffer struktūras gadījumos pipe_inode_info gredzenu struktūrās. Pēc tam tiek veikts izsaukums splice(), lai nolasītu datus no mērķa faila nenosauktā caurulē, sākot ar vēlamo nobīdi. Ierakstot datus uz šo nenosaukto cauruli, jo tiek iestatīts karogs PIPE_BUF_FLAG_CAN_MERGE, lapas kešatmiņā esošie dati tiks pārrakstīti, nevis tiks izveidots jauns pipe_buffer struktūras gadījums.

Avots: opennet.ru

Pievieno komentāru