Firma Qualys odkryła trzy luki w narzędziu needrestart, które służy do ponownego uruchamiania procesów w tle po aktualizacji bibliotek używanych przez dane procesy. Od wersji Ubuntu 21.04 narzędzie needrestart jest częścią podstawowego środowiska Ubuntu Server, w którym jest uruchamiane z prawami roota na końcu każdej transakcji menedżera pakietów APT, skanuje uruchomione procesy i ponownie uruchamia te, które są powiązane z plikami zmienionymi po aktualizacji pakietów. Odkryte luki umożliwiają lokalnemu użytkownikowi bez przywilejów uzyskanie uprawnień roota w domyślnej konfiguracji Ubuntu Server.
Luki są obecne w needrestart od wersji 0.8 (2014 rok) i zostały naprawione w wydaniu needrestart 3.8. Problemy zostały również rozwiązane w dystrybucjach Debian i Ubuntu. Jako obejście blokujące możliwość wykorzystania luk, można wyłączyć skanowanie interpreterów, ustawiając w pliku konfiguracyjnym /etc/needrestart/needrestart.conf parametr „$nrconf{interpscan} = 0”.
Luki są obecne w kodzie realizującym tryb określania aktualizacji skryptów uruchamianych z wykorzystaniem interpreterów. Zidentyfikowane problemy:
- CVE-2024-48990 — lokalny użytkownik może uzyskać wykonanie kodu z prawami roota poprzez stworzenie warunków do uruchomienia interpretera Pythona z ustawioną przez atakującego zmienną środowiskową PYTHONPATH. Oprócz wykorzystania Pythona, atak może być przeprowadzony (CVE-2024-48992) poprzez uruchomienie interpretera Ruby z zmienną środowiskową RUBYLIB.
Luki wynikają z tego, że w procesie ponownego uruchamiania zmienionego skryptu narzędzie needrestart ustawia zmienną środowiskową PYTHONPATH na podstawie zawartości pliku /proc/pid/environ, którą następnie wykorzystuje do uruchomienia własnego kodu Pythona. W związku z tym, atakujący może poczekać na aktywność związaną z działaniem menedżera pakietów APT, zasymulować zmianę swojego skryptu i ustawić dla niego zmienną środowiskową PYTHONPATH, która również zostanie zastosowana przy uruchamianiu wbudowanego w needrestart kodu Pythona ("import sys\n print(sys.path)") uruchamianego z prawami roota.
Na przykład, aby wykorzystać lukę, można uruchomić proces Pythona, który będzie stale w pamięci, ustawiając dla niego zmienną środowiskową "PYTHONPATH=/home/test", i umieścić bibliotekę współdzieloną "/home/test/importlib/__init__.so", która zostanie wykonana podczas uruchamiania uprzywilejowanego kodu Pythona w needrestart.
- CVE-2024-48991 — lokalny użytkownik może uzyskać wykonanie kodu z uprawnieniami root poprzez inicjowanie stanu wyścigu (race condition), w wyniku którego needrestart uruchomi fałszywy interpreter Pythona podstawiony przez atakującego, zamiast systemowego interpretera Pythona. Istota luki jest podobna do wspomnianego wcześniej problemu, różnica polega jedynie na tym, że needrestart identyfikuje nazwę procesu Pythona (na przykład, /usr/bin/python3) poprzez odczyt "proc/pid/exe".
Aby wykorzystać lukę, można stworzyć proces /home/test/race, który za pomocą mechanizmu inotify poczeka na moment, gdy needrestart zacznie czytać zawartość /proc/pid/exe, i natychmiast uruchomi przez funkcję execve systemowy interpreter Pythona. Ponieważ needrestart nie wykonuje weryfikacji, czy jest to prawdziwy Python, weźmie pod uwagę, że /home/test/race to interpreter Pythona i uruchomi go dla własnego kodu.
- CVE-2024-11003 — lokalny użytkownik może uzyskać wykonanie dowolnych komend shell z prawami root poprzez stworzenie warunków do przetwarzania w needrestart nazw plików w formacie "komenda|", co spowoduje wywołanie komendy w funkcji open() w Perl. Istotnie, luka objawia się w module Perl ScanDeps (CVE-2024-10224), ale jest spowodowana przekazywaniem do tego modułu zewnętrznych parametrów bez odpowiedniej weryfikacji.
Atak może być przeprowadzony poprzez uruchomienie skryptu Perl z symbolem "|" w nazwie, na przykład, "/home/test/perl|". W trakcie wykonywania funkcji scan_deps() w needrestart, ten plik zostanie otwarty przez funkcję open(), która potraktuje symbol "|" jako flaga do uruchomienia programu "/home/test/perl" i wykorzystania uzyskanego z tego programu strumienia wyjściowego.
Źródło: opennet.ru
