Компания Qualys откри уязвимост (CVE-2025-6019) в библиотеката libblockdev, която позволява чрез манипулации с фоновия процес udisks да се получат права root в системата. Прототипът на експлойта е демонстриран в Ubuntu, Debian, Fedora и openSUSE Leap 15.
Процесът udisks се прилага практически във всички дистрибуции на Linux и предоставя интерфейс D-Bus за извършване на операции с устройства за съхранение, като монтиране и форматиране. За извършване на действия с устройствата udisks извиква функции от библиотеката 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, които при последваща обработка ще бъдат интерпретирани като признак за физическо присъствие на потребителя, дори ако влизането е извършено по SSH. Модулът pam_env също се извиква при свързване по SSH в Debian 12 и Ubuntu 24.04 (в Debian 13 и Ubuntu 24.10+ е деактивиран), но задаването на променливите на средата в тези дистрибуции не може да се използва за повишаване на нивото на достъп до 'allow_active', тъй като pam_env се извиква на финалния етап след зареждането на модула pam_systemd и зададените променливи на средата не могат да повлияят на параметрите на сесията.
По отношение на уязвимостта в libblockdev, атакуващият може да монтира образ на произволна файлова система в loop-режим, поставяйки в този образ изпълняем файл с флаг SUID root или специално устройство (/dev/mem) за нискоуровневен достъп до дискове или памет. За блокиране на подобни атаки образите на ФС се монтират от системата с флаговете nosuid и nodev, но уязвимостта в libblockdev позволява монтиране на образ без флаговете nosuid и nodev. Същността на уязвимостта е, че udisks позволява на потребители с ниво на достъп 'allow_active' да променят размера на своите файлови системи и libblockdev по време на изпълнението на тази операция временно монтира ФС без задаване на флаговете nosuid и nodev.
Така атаката се свежда до създаването на loop-устройство на база образ на ФС XFS, в който е поставен suid root файл, инициирането на операция по промяна размера на loop-устройството и следенето на момента на неговото монтиране в каталог /tmp/blockdev*: victim> killall -KILL gvfs-udisks2-volume-monitor victim> udisksctl loop-setup --file ./xfs.image --no-user-interaction Мапнат файл ./xfs.image като /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 '{}' Грешка: GDBus.Error:org.freedesktop.UDisks2.Error.Failed: Грешка при преоразмеряване на файловата система на /dev/loop0: Неуспешно демонтиране на '/dev/loop0' след преоразмеряване: целта е заета -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, Gentoo и 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, Gentoo и Arch (1, 2).
Източник: opennet.ru
