Společnost Qualys identifikovala tři zranitelnosti v nástroji needrestart, určeném k restartování pozadí procesů po aktualizaci knihoven používaných těmito procesy. Od verze Ubuntu 21.04 je nástroj needrestart součástí základního prostředí Ubuntu Server, kde se spouští s oprávněním root na konci každé transakce správce balíčků APT, skenuje běžící procesy a restartuje ty, které souvisejí se soubory, které byly po aktualizaci balíčků změněny. Zjištěné zranitelnosti umožňují místnímu neprivilegovanému uživateli získat oprávnění root v Ubuntu Server v základní konfiguraci.
Zranitelnosti jsou přítomny v needrestart od verze 0.8 (2014) a byly opraveny ve verzi needrestart 3.8. Problémy byly již také opraveny v distribucích Debian a Ubuntu. Jako jediné dočasné řešení pro blokaci zneužití zranitelností lze vypnout skenování interpretátorů nastavením parametru "$nrconf{interpscan} = 0" v konfiguračním souboru /etc/needrestart/needrestart.conf.
Zranitelnosti jsou přítomny v kódu, který implementuje režim detekce aktualizace skriptů spuštěných pomocí interpretátorů. Identifikované problémy:
- CVE-2024-48990 — místní uživatel může dosáhnout spuštění kódu s oprávněním root tím, že vytvoří podmínky pro spuštění Python interpretátoru s proměnnou prostředí PYTHONPATH nastavenou útočníkem. Kromě použití Pythonu může být útok také proveden (CVE-2024-48992) pomocí spuštění Ruby interpretátoru s proměnnou prostředí RUBYLIB.
Zranitelnosti jsou způsobeny tím, že při restartování změněného skriptu nástroj needrestart nastavuje proměnnou prostředí PYTHONPATH na základě obsahu souboru /proc/pid/environ, kterou pak používá i pro spuštění vlastního Python kódu. Útočník může tedy počkat na aktivity související s činností správce balíčků APT, simulovat změnu svého skriptu a nastavit pro něj proměnnou prostředí PYTHONPATH, která bude také použita při spuštění vestavěného Python kódu v needrestart („import sys print(sys.path)“), vykonávaného s oprávněním root.
Například pro zneužití zranitelnosti lze spuštěním stále běžícího Python procesu s proměnnou prostředí „PYTHONPATH=/home/test“ umístit sdílenou knihovnu „/home/test/importlib/__init__.so“, která bude vykonána při spuštění privilegovaného Python kódu v needrestart.
- CVE-2024-48991 — místní uživatel může dosáhnout spuštění kódu s oprávněním root prostřednictvím iniciace stavu závodu (race condition), v důsledku kterého needrestart spustí falešný interpreter Pythonu zvolený útočníkem místo systémového interpretera Pythonu. Podstata zranitelnosti je podobná výše uvedenému problému, rozdíl je pouze v tom, že needrestart určuje název procesu Pythonu (například /usr/bin/python3) čtením „/proc/pid/exe“.
Pro zneužití zranitelnosti lze vytvořit proces /home/test/race, který pomocí mechanismu inotify počká na okamžik, kdy needrestart začne číst obsah /proc/pid/exe, a ihned spustí systémový interpreter Pythonu prostřednictvím funkce execve. Jelikož needrestart neprovádí kontrolu, zda se skutečně jedná o Python, předpokládá, že /home/test/race je interpreter Pythonu a spustí ho pro svůj kód.
- CVE-2024-11003 — místní uživatel může dosáhnout vykonání libovolných shellových příkazů s oprávněním root vytvořením podmínek pro zpracování v needrestart názvů souborů ve formátu „příkaz|“, jejichž předání do Perl funkce open() povede ke spuštění příkazu. V podstatě se zranitelnost projevuje v Perl modulu ScanDeps (CVE-2024-10224), ale je způsobena předáním externích parametrů do tohoto modulu bez řádné kontroly.
Útok může být proveden spuštěním Perl skriptu se symbolem „|“ v názvu, například „/home/test/perl|“. Během provádění funkce scan_deps() v needrestart bude tento soubor otevřen pomocí funkce open(), která zpracuje symbol „|“ jako příznak pro spuštění programu „/home/test/perl“ a použití výstupního proudu získaného z tohoto programu.
Zdroj: opennet.ru
