Вразливість у ядрі 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 LTS. Ядра RHEL 8.x і openSUSE/SUSE 15 спочатку засновані на старих гілках, але не виключено, що зміна, що викликала проблему, була бекпоритовано в них (точних даних поки немає). Простежити за публікацією оновлень пакетів у дистрибутивах можна на сторінках: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Arch Linux. Виправлення вразливості запропоновано у випусках 5.16.11, 5.15.25 та 5.10.102. Виправлення також включено до ядра, що використовується у платформі Android.

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

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

Експлуатація зводиться до створення неіменованого каналу та наповнення його довільними даними для того, щоб досягти виставлення прапора PIPE_BUF_FLAG_CAN_MERGE у всіх пов'язаних з ним кільцевих структурах. Далі дані читаються з каналу, але прапор залишається виставлених у всіх екземплярах структури pipe_buffer у кільцевих структурах pipe_inode_info. Потім виконується виклик splice() для читання даних із цільового файлу в неіменований канал, починаючи з необхідного усунення. При записі даних у цей неіменований канал через виставлений прапор PIPE_BUF_FLAG_CAN_MERGE дані в сторінковому кеші будуть перезаписані замість створення нового екземпляра структури pipe_buffer.

Джерело: opennet.ru

Додати коментар або відгук