Firma Qualys zidentyfikowała lukę (CVE-2025-6019) w bibliotece libblockdev, która pozwala na uzyskanie uprawnień root w systemie poprzez manipulacje z tłem procesu udisks. Działanie prototypowego exploita zostało zaprezentowane w systemach Ubuntu, Debian, Fedora i openSUSE Leap 15.
Proces udisks jest stosowany praktycznie we wszystkich dystrybucjach Linux i udostępnia interfejs D-Bus do wykonywania operacji na nośnikach, takich jak montowanie i formatowanie. Aby wykonać operacje na nośnikach, udisks wywołuje funkcje biblioteki libblockdev. Dostęp do udisks jest domyślnie otwarty tylko dla użytkowników pracujących w kontekście „allow_active”, tzn. mających fizyczny dostęp do komputera i logujących się przez lokalną konsolę lub uruchamiających sesję graficzną. Użytkownicy łączący się zdalnie, na przykład przez ssh, nie są w tym kontekście i nie mogą bezpośrednio wykorzystać luki.
Aby obejść to ograniczenie, można zastosować sztuczkę podnoszącą poziom uwierzytelnienia do „allow_active” poprzez manipulację uruchomieniem usługi systemctl użytkownika, co polkitd uzna za oznakę lokalnej sesji. Istotą metody jest to, że polkitd określa obecność fizycznego dostępu i przypisuje poziom „allow_active” na podstawie pośrednich oznak, na które można wpływać. Ograniczenie tej metody polega na tym, że aby oszukać polkitd, w systemie musi już być aktywna sesja lokalnego użytkownika z fizycznym dostępem.
Drugą metodą uzyskiwania praw „allow_active” jest wykorzystanie luki (CVE-2025-6018) w PAM (Pluggable Authentication Modules), którą badacze z Qualys zidentyfikowali podczas analizy luki w libblockdev. Luka ta pozwala dowolnemu użytkownikowi, w tym tym, który połączył się przez SSH, na wykonywanie operacji w kontekście „allow_active”. Problem ten dotyczy ustawień PAM w openSUSE Leap 15 i SUSE Linux Enterprise 15 oraz występuje tylko w tych dystrybucjach.
W module pam_env w openSUSE i SUSE domyślnie włączone jest odczytywanie pliku ~/.pam_environment. Poprzez ten plik użytkownik może ustawić zmienne środowiskowe XDG_SEAT=seat0 oraz XDG_VTNR=1, które w dalszej obróbce będą interpretowane jako oznaka fizycznej obecności użytkownika, nawet jeśli faktyczny dostęp był realizowany przez SSH. Moduł pam_env jest również wywoływany przy podłączeniu przez ssh w Debianie 12 i Ubuntu 24.04 (w Debianie 13 i Ubuntu 24.10+ jest wyłączony), ale ustawienie zmiennych środowiskowych w tych dystrybucjach nie może być wykorzystane do podniesienia poziomu dostępu do „allow_active”, ponieważ pam_env jest wywoływany na finalnym etapie po załadowaniu modułu pam_systemd, a ustawione zmienne środowiskowe nie mogą wpłynąć na parametry sesji.
Jeśli chodzi o podatność w libblockdev, to atakujący może zamontować obraz dowolnego systemu plików w trybie loop, umieszczając w tym obrazie plik wykonywalny z flagą SUID root lub specjalne urządzenie (/dev/mem) do niskopoziomowego dostępu do dysków lub pamięci. Aby zablokować takie ataki, obrazy FS są montowane przez system z flagami nosuid i nodev, ale podatność w libblockdev pozwala na zamontowanie obrazu bez flag nosuid i nodev. Sedno podatności polega na tym, że udisks pozwala użytkownikowi z poziomem dostępu „allow_active” zmieniać rozmiar swoich systemów plików, a libblockdev w trakcie wykonywania tej operacji tymczasowo montuje FS bez ustawiania flag nosuid i nodev.
W ten sposób atak polega na stworzeniu urządzenia loop na podstawie obrazu FS XFS, w którym umieszczony jest plik suid root, zainicjowaniu operacji zmiany rozmiaru urządzenia loop i śledzeniu momentu jego montowania w katalogu /tmp/blockdev*: victim> killall -KILL gvfs-udisks2-volume-monitor victim> udisksctl loop-setup —file ./xfs.image —no-user-interaction Zamapowano plik ./xfs.image jako /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 ‘{}’ Błąd: GDBus.Error:org.freedesktop.UDisks2.Error.Failed: Błąd podczas zmiany rozmiaru systemu plików na /dev/loop0: Nie udało się odmontować ‘/dev/loop0’ po zmianie rozmiaru: docelowy jest zajęty -r-sr-xr-x. 1 root root 1406608 Cze 18 09:42 /tmp/blockdev.RSM429/bash victim> /tmp/blockdev*/bash -p victim# id uid=65534(nobody) gid=65534(nobody) euid=0(root) grupy=65534(nobody)
Luka w libblockdev została naprawiona jedynie w postaci poprawek. Stan nowej wersji pakietu lub przygotowania poprawki w dystrybucjach można sprawdzić na następujących stronach (jeśli strona jest niedostępna, oznacza to, że deweloperzy dystrybucji jeszcze nie rozpoczęli rozpatrywania problemu): Debian, Ubuntu, Fedora, SUSE/openSUSE, RHEL, Gentoo oraz Arch (1, 2). Jako obejście w celu zablokowania luki można zmienić regułę dostępu do operacji „org.freedesktop.udisks2.modify-device” w polkit, zmieniając w pliku /usr/share/polkit-1/actions/org.freedesktop.UDisks2.policy wartość parametru „allow_active” z „yes” na „auth_admin.”
Dodatkowo można zauważyć ujawnioną kilka godzin temu lukę (CVE-2025-6020) w pakiecie linux-pam, umożliwiającą lokalnemu użytkownikowi uzyskanie uprawnień root. Moduł pam_namespace niewłaściwie sprawdzał ścieżki plików kontrolowane przez użytkownika, co pozwalało na manipulacje z symlinkami i osiągnięcie stanu wyścigu w celu nadpisania uprzywilejowanych plików w systemie. Luka została usunięta w wydaniu linux-pam 1.7.1. Stan nowej wersji pakietu lub przygotowania poprawki w dystrybucjach można sprawdzić na następujących stronach: Debian, Ubuntu, Fedora, SUSE/openSUSE, RHEL, Gentoo oraz Arch (1, 2).
Źródło: opennet.ru
