Недавно стало известно, что в ядре Linux была обнаружена уязвимость и который уже внесен в каталог под CVE-2022-0847 и который они назвали как "Грязная труба".
Эта уязвимость получила название «Грязная труба».позволяет перезаписать содержимое кеша страницы для любого файла, в том числе установленного только для чтения, открытого с флагом O_RDONLY или расположенного в файловых системах, смонтированных только для чтения.
С практической точки зрения уязвимость может использоваться для внедрения кода в произвольные процессы или поврежденные данные в открытых файлах. Например, вы можете изменить содержимое файла author_keys для процесса sshd.
О грязной трубе
Похоже на критическую уязвимость Dirty COW. идентифицирован в 2016 году, и упоминается, что Dirty Pipe находится на том же уровне, что и Dirty COW с точки зрения опасности, но что этот намного проще в эксплуатации.
Dirty Pipe была выявлена при разборе жалоб на периодическую порчу архивов загружены по сети на систему, загружающую с сервера журналирования сжатые файлы (37 повреждений за 3 месяца на загруженной системе), которые были подготовлены с использованием операции splice() и безымянных каналов.
Уязвимость проявляется с версии ядра Linux 5.8, выпущенный в августе 2020 года.
С другой стороны, можно сказать, что он присутствует в Debian 11, но не влияет на базовое ядро в Ubuntu 20.04 LTS, тогда как для ядер RHEL 8.x и openSUSE/SUSE 15, которые изначально основаны на старых ветках, но это возможно что изменение, вызывающее проблему, было передано им (точных данных пока нет).
Уязвимость связана с отсутствием инициализации значения "buf->flags" в коде функций copy_page_to_iter_pipe() и push_pipe(), несмотря на то, что память не очищается при выделении структуры, и при определенных манипуляциях с безымянными каналы, "buf->flags" может содержать значение из другой операции. С помощью этой функции непривилегированный локальный пользователь может добиться появления значения PIPE_BUF_FLAG_CAN_MERGE во флаге, что позволяет ему перезаписывать данные в кэше страниц, просто записывая новые данные в специально подготовленный безымянный канал.
для атаки можно сделать, нужен целевой файл, который должен быть читабельным а так как права доступа не проверяются при записи в канал, замена может производиться в страничном кэше даже для файлов, расположенных на разделах только для чтения (например, для файлов c CD-ROM).
При этом, после замены информации в страничном кэше, процесс при чтении данных из файла будет получать не настоящие данные, а замененные.
Упоминается, что операция Dirty Pipe сводится к созданию безымянного канала и заполнению его произвольными данными добиться установки флага PIPE_BUF_FLAG_CAN_MERGE на всех связанных с ним кольцевых структурах.
Затем данные считываются из канала, но флаг остается установленным для всех экземпляров структуры pipe_buffer в кольцевых структурах pipe_inode_info. Затем выполняется вызов splice() для чтения данных из целевого файла в безымянный канал, начиная с требуемого смещения. При записи данных в этот безымянный канал флаг PIPE_BUF_FLAG_CAN_MERGE перезапишет данные в кэше страниц вместо создания нового экземпляра структуры pipe_buffer.
В конце концов Если вам интересно узнать об этом больше, Вы можете проверить детали в исходной заметке По следующей ссылке.
Также, если вы заинтересованы в иметь возможность следить или знать о публикации обновлений пакетов в основных дистрибутивах, вы можете сделать это с этих страниц: Debian, SUSE, Ubuntu, RHEL, Fedora, Gentoo, Арх Линукс.
Упоминается, что предлагаемое исправление уязвимости доступно в версиях ядра Linux 5.16.11, 5.15.25 и 5.10.102, а также исправление включено в ядро, используемое на платформе Android.