Уразлівасць у ядры Linux, якая дазваляе сказіць файлы, даступныя толькі для чытання

У ядры Linux выяўленая ўразлівасць (CVE-2022-0847), якая дазваляе перазапісаць змесціва старонкавага кэша для любых файлаў, у тым ліку змешчаных у рэжыме толькі для чытання, адчыненых са сцягам O_RDONLY або змесцаваных у файлавых сістэмах, прымантаваных у рэжыме. З практычнага боку, уразлівасць можа ўжывацца для падстаноўкі кода ў адвольныя працэсы або скажэнні дадзеных у адчыняных файлах. Напрыклад, можна змяніць змесціва файла authorized_keys для працэсу sshd. Для тэставання даступны прататып эксплоіту.

Праблеме прысвоена кодавае імя Dirty Pipe, па аналогіі з выяўленай у 2016 годзе крытычнай уразлівасцю Dirty COW. Адзначаецца, што па ўзроўні небяспекі Dirty Pipe знаходзіцца на адным узроўні з Dirty COW, але значна прасцей у эксплуатацыі. Уразлівасць была выяўлена падчас разбору скаргаў аб перыядычным пашкоджанні загружаных па сетцы файлаў у сістэме, якая загружае сціснутыя архівы з log-сервера (37 пашкоджанняў за 3 месяцы на нагружанай сістэме), пры падрыхтоўцы якіх выкарыстоўвалася аперацыя splice() і неназваныя каналы.

Уразлівасць выяўляецца пачынальна з ядра Linux 5.8, выпушчанага ў жніўні 2020 гады, г.зн. прысутнічае ў Debian 11, але не закранае базавую ядро ​​ў Ubuntu 20.04/8 LTS. Ядры RHEL 15.x і openSUSE/SUSE 5.16.11 першапачаткова заснаваныя на старых галінках, але не выключана, што якая выклікала праблему змена было бэкпарыціравана ў іх (дакладных дадзеных пакуль няма). Прасачыць за публікацыяй абнаўленняў пакетаў у дыстрыбутывах можна на дадзеных старонках: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Выпраўленне ўразлівасці прапанавана ў выпусках 5.15.25, 5.10.102 і XNUMX. Выпраўленне таксама ўключана ў ядро, якое выкарыстоўваецца ў платформе Android.

Уразлівасць выкліканая адсутнасцю ініцыялізацыі значэння «buf->flags» у кодзе функцый copy_page_to_iter_pipe() і push_pipe(), пры тым, што памяць пры вылучэнні структуры не чысціцца і пры вызначаных маніпуляцыях з неназванымі каналамі ў «buf->flags» іншай аперацыі. Выкарыстоўваючы дадзеную асаблівасць непрывілеяваны лакальны карыстач можа дамагчыся з'яўленні ў сцягу значэння PIPE_BUF_FLAG_CAN_MERGE, якое дазваляе арганізаваць перазапіс дадзеных у старонкавым кэшы праз просты запіс новых дадзеных у адмыслова падрыхтаваны неназваны канал (pipe).

Для нападу мэтавы файл павінен быць даступны на чытанне, пры гэтым бо пры запісе ў pipe не правяраюцца правы доступу замена ў старонкавым кэшы можа быць вырабленая ў тым ліку і для файлаў, змешчаных у частках, прымантаваных толькі для чытання (напрыклад, для файлаў з CD-ROM). Пасля замены інфармацыі ў старонкавым кэшы працэс пры чытанні дадзеных з файла атрымае не фактычныя, а падмененыя дадзеныя.

Эксплуатацыя зводзіцца да стварэння неназванага канала і напаўненню яго адвольнымі дадзенымі для таго, каб дамагчыся выстаўленні сцяга PIPE_BUF_FLAG_CAN_MERGE ва ўсіх злучаных з ім колцавых структурах. Далей дадзеныя чытаюцца з канала, але сцяг застаецца выстаўленых ва ўсіх асобніках структуры pipe_buffer у колцавых структурах pipe_inode_info. Затым выконваецца выклік splice() для чытання дадзеных з мэтавага файла ў неназваны канал, пачынальна з патрабаванага зрушэння. Пры запісе дадзеных у гэты неназваны канал з-за выстаўленага сцяга PIPE_BUF_FLAG_CAN_MERGE дадзеныя ў старонкавым кэшы будуць перазапісаныя, замест стварэння новага асобніка структуры pipe_buffer.

Крыніца: opennet.ru

Дадаць каментар