Die Firma Qualys hat drei Schwachstellen im Tool needrestart entdeckt, das zum Neustarten von Hintergrundprozessen nach der Aktualisierung von Bibliotheken verwendet wird, die von den Datenprozessen genutzt werden. Seit Ubuntu 21.04 ist das Tool needrestart Teil der Standardumgebung von Ubuntu Server, wo es mit root-Rechten am Ende jeder Transaktion des APT-Paketmanagers ausgeführt wird, aktive Prozesse scannt und die neu gestarteten Prozesse, die mit Dateien verbunden sind, die nach Paketaktualisierungen geändert wurden, neu startet. Die entdeckten Schwachstellen ermöglichen es einem lokalen unprivilegierten Benutzer, root-Rechte in einer standardmäßigen Ubuntu Server-Konfiguration zu erlangen.
Die Schwachstellen sind in needrestart ab Version 0.8 (2014) vorhanden und wurden in der Version needrestart 3.8 behoben. Die Probleme wurden ebenfalls in den Distributionen Debian und Ubuntu bereits behoben. Als Workaround zur Verhinderung der Ausnutzung der Schwachstelle kann das Scannen von Interpretern deaktiviert werden, indem im Konfigurationsfile /etc/needrestart/needrestart.conf der Parameter „$nrconf{interpscan} = 0“ gesetzt wird.
Die Schwachstellen sind im Code zur Erkennung des Updates von Skripten vorhanden, die unter Verwendung von Interpretern ausgeführt werden. Die festgestellten Probleme sind:
- CVE-2024-48990 – Ein lokaler Benutzer kann die Ausführung von Code mit root-Rechten erreichen, indem er Bedingungen schafft, um den Python-Interpreter mit der vom Angreifer festgelegten Umgebungsvariable PYTHONPATH zu starten. Neben der Verwendung von Python kann der Angriff auch (CVE-2024-48992) durch den Start des Ruby-Interpreters mit der Umgebungsvariable RUBYLIB durchgeführt werden.
Die Schwachstellen entstehen dadurch, dass das Tool needrestart beim Neustart eines geänderten Skripts die Umgebungsvariable PYTHONPATH basierend auf dem Inhalt der Datei /proc/pid/environ festlegt, die dann auch für die Ausführung des eigenen Python-Codes verwendet wird. Dementsprechend kann ein Angreifer auf die Aktivität im Zusammenhang mit dem APT-Paketmanager warten, eine Änderung seines Skripts simulieren und eine Umgebungsvariable PYTHONPATH festlegen, die auch beim Start des in needrestart integrierten Python-Codes („import sys\n print(sys.path)“), der mit root-Rechten ausgeführt wird, angewendet wird.
Zum Beispiel kann zur Ausnutzung der Schwachstelle ein dauerhaft im Speicher schwebender Python-Prozess gestartet werden, indem die Umgebungsvariable "PYTHONPATH=/home/test" gesetzt wird, und eine freigegebene Bibliothek "home/test/importlib/__init__.so" platziert wird, die beim Ausführen des privilegierten Python-Codes in needrestart ausgeführt wird.
- CVE-2024-48991 – Ein lokaler Benutzer kann durch Initiierung eines Rennzustands (race condition) die Ausführung von Code mit Root-Rechten erreichen, wobei needrestart einen gefälschten Python-Interpreter, der von einem Angreifer bereitgestellt wurde, anstelle des systemeigenen Python-Interpreters startet. Die Schwachstelle ist ähnlich wie das oben erwähnte Problem, der Unterschied besteht nur darin, dass needrestart den Namen des Python-Prozesses (z. B. /usr/bin/python3) durch das Lesen von "/proc/pid/exe" ermittelt.
Zur Ausnutzung der Schwachstelle kann ein Prozess "/home/test/race" erstellt werden, der mithilfe des Mechanismus inotify auf den Moment wartet, wenn needrestart beginnt, den Inhalt von "/proc/pid/exe" zu lesen, und sofort über die Funktion execve den systemeigenen Python-Interpreter startet. Da needrestart nicht überprüft, ob es sich tatsächlich um Python handelt, wird es "/home/test/race" als Python-Interpreter betrachten und ihn für seinen Code ausführen.
- CVE-2024-11003 – Ein lokaler Benutzer kann durch Schaffung von Bedingungen zur Verarbeitung von Dateinamen im Format "Befehl|" in needrestart die Ausführung beliebiger Shell-Befehle mit Root-Rechten erreichen, wobei die Übergabe an die Perl-Funktion open() zur Ausführung des Befehls führt. Tatsächlich zeigt sich die Schwachstelle im Perl-Modul ScanDeps (CVE-2024-10224), ist jedoch das Ergebnis einer unzureichenden Überprüfung von externen Parametern, die an dieses Modul übergeben werden.
Der Angriff kann durch das Starten eines Perl-Skripts mit dem Symbol "|" im Namen, z. B. "/home/test/perl|", erfolgen. Während der Ausführung der Funktion scan_deps() in needrestart wird diese Datei über die Funktion open() geöffnet, die das Symbol "|" als Flag zur Ausführung des Programms "/home/test/perl" behandelt und den von diesem Programm erzeugten Ausgabestream verwendet.
Quelle: opennet.ru
