Компанията 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 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, 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
