Уязвимости в PAM и Libblockdev, позволяющие получить права Root в системе

Компания Qualys выявила уязвимость (CVE-2025-6019) в библиотеке libblockdev, позволяющую через манипуляции с фоновым процессом udisks получить права root в системе. Работа прототипа эксплоита продемонстрирована в Ubuntu, Debian, Fedora и openSUSE Leap 15.

Процесс udisks применяется практически во всех дистрибутивах Linux и предоставляет интерфейс D-Bus для выполнения операций с накопителями, таких как монтирование и форматирование. Фактически операции с накопителями выполняются через вызов функций libblockdev. Доступ к udisks по умолчанию открыт только для пользователей, работающих в контексте “allow_active”, т.е. имеющих физический доступ к компьютеру и подключившихся через локальную консоль или запустивших графический сеанс. Пользователи, подключающиеся удалённо, например, по ssh, не попадают в этот контекст и напрямую не могут эксплуатировать уязвимость.

Для обхода данного ограничения можно использовать трюк, позволяющий поднять уровень аутентификации до “allow_active” через манипуляции с запуском утилитой systemctl пользовательского сервиса, который polkitd воспримет как признак локального сеанса. Суть метода в том, что polkitd определяет наличие физического доступа и присваивает уровень “allow_active” на основе косвенных признаков, на которые можно повлиять. Ограничения метода в том, что для обмана polkitd требуется, чтобы к системе уже был активен сеанс локального пользователя с физическим доступом, т.е. метод не подходит для серверов.

Вторым методом получения прав “allow_active” является эксплуатация уязвимости (CVE-2025-6018) в PAM (Pluggable Authentication Modules), которую исследователи из Qualys выявили в ходе анализа уязвимости в libblockdev. Уязвимость позволяет любому пользователю, в том числе подключившемуся по SSH, выполнять операции в контексте “allow_active”. Проблема специфичная для настроек PAM в openSUSE Leap 15 и SUSE Linux Enterprise 15, и проявляется только в этих дистрибутивах.

В модуле pam_env в openSUSE и SUSE по умолчанию включено чтение файла ~/.pam_environment. Через данный файл пользователь может выставить переменные окружения XDG_SEAT=seat0 и XDG_VTNR=1, которые при дальнейшей обработке будут восприняты polkit как признак физического присутствия пользователя, даже если фактически вход осуществлён по SSH. Модуль pam_env также вызывается при подключении по ssh в Debian 12 и Ubuntu 24.04 (в Debian 13 и Ubuntu 24.10+ он отключён), но выставление переменных окружения в данных дистрибутивах может применяться для повышения уровня доступа до “allow_active”, так как pam_env вызывается на финальном этапе после загрузки модуля pam_systemd и выставленные переменные окружения не могут повлиять на параметры сеанса.

Что касается уязвимости в libblockdev, то при помощи udisks атакующий может примонтировать образ произвольной файловой системы в loop-режиме, разместив в этом образе исполняемый файл с флагом SUID root или специальное устройство (/dev/mem) для низкоуровневого доступа к дискам или памяти. Для блокирования подобных атак подобные образы монтируются системой с флагами nosuid и nodev, но уязвимость в libblockdev даёт возможность примонтировать образ без флагов nosuid и nodev. Суть уязвимости в том, что udisks позволяет пользователю с уровнем доступа “allow_active” менять размер своих файловых систем и libblockdev в процессе выполнения данной операции временно монтирует ФС XFS во временную точку монтирования без выставления флагов nosuid и nodev.

Таким образом атака сводится к созданию loop-устройства на базе образа ФС XFS, в котором размещён suid root файл, инициирования операции изменения его размера и отслеживанию момента его монтирования в каталог /tmp/blockdev*:

victim> killall -KILL gvfs-udisks2-volume-monitor victim> udisksctl loop-setup –file ./xfs.image –no-user-interaction Mapped file ./xfs.image as /dev/loop0. victim> while true; do /tmp/blockdev*/bash -c ‘sleep 10; ls -l /tmp/blockdev*/bash’ && break; done 2>/dev/null & victim> gdbus call –system –dest org.freedesktop.UDisks2 –object-path /org/freedesktop/UDisks2/block_devices/loop0 –method org.freedesktop.UDisks2.Filesystem.Resize 0 ‘{}’ Error: GDBus.Error:org.freedesktop.UDisks2.Error.Failed: Error resizing filesystem on /dev/loop0: Failed to unmount ‘/dev/loop0’ after resizing it: target is busy -r-sr-xr-x. 1 root root 1406608 Jun 18 09:42 /tmp/blockdev.RSM429/bash victim> /tmp/blockdev*/bash -p victim# id uid=65534(nobody) gid=65534(nobody) euid=0(root) groups=65534(nobody)

Уязвимость в libblockdev пока устранена только в виде патчей. Проверить состояние новой версии пакета или подготовки исправления в дистрибутивах можно на следующих страницах (если страница недоступна, значит разработчики дистрибутива ещё не приступили к рассмотрению проблемы): Debian, Ubuntu, Fedora, SUSE/openSUSE, RHEL и Arch (1, 2). В качестве обходных путей для блокирования уязвимости можно изменить правило доступа к операции “org.freedesktop.udisks2.modify-device” в polkit, изменив в файле /usr/share/polkit-1/actions/org.freedesktop.UDisks2.policy значение параметра “allow_active” с “yes” на “auth_admin”.

Дополнительно можно отметить раскрытую вчера уязвимость (CVE-2025-6020) в пакете linux-pam, позволяющую локальному пользователю получить права root. Модуль pam_namespace должным образом не проверял файловые пути, подконтрольные пользователю, что позволяло через манипуляции с символическими ссылками и достижение состояния гонки добиться перезаписи привилегированных файлов в системе. Уязвимость устранена в выпуске linux-pam 1.7.1. Проверить состояние новой версии пакета или подготовки исправления в дистрибутивах можно на следующих страницах (если страница недоступна, значит разработчики дистрибутива ещё не приступили к рассмотрению проблемы): Debian, Ubuntu, Fedora, SUSE/openSUSE, RHEL и Arch (1, 2).

Release. Ссылка here.