La société Qualys a identifié trois vulnérabilités dans l'outil needrestart, conçu pour redémarrer les processus en arrière-plan après la mise à jour des bibliothèques utilisées par ces processus. À partir d'Ubuntu 21.04, l'outil needrestart est inclus dans l'environnement de base d'Ubuntu Server, où il s'exécute avec des droits root à la fin de chaque transaction du gestionnaire de paquets APT, scanne les processus en cours et redémarre ceux qui sont liés aux fichiers modifiés après la mise à jour des paquets. Les vulnérabilités identifiées permettent à un utilisateur local non privilégié d'obtenir des droits root dans Ubuntu Server dans sa configuration par défaut.
Les vulnérabilités sont présentes dans needrestart depuis la version 0.8 (2014) et ont été corrigées dans la version 3.8 de needrestart. Les problèmes ont également été résolus dans les distributions Debian et Ubuntu. Comme solution de contournement pour bloquer l'exploitation des vulnérabilités, vous pouvez désactiver le scan des interprètes en définissant dans le fichier de configuration /etc/needrestart/needrestart.conf le paramètre « $nrconf{interpscan} = 0 ».
Les vulnérabilités sont présentes dans le code de mise en œuvre du mode de détection des mises à jour des scripts exécutés à l'aide des interprètes. Problèmes identifiés :
- CVE-2024-48990 — un utilisateur local peut provoquer une exécution de code avec des droits root en créant des conditions pour lancer l'interpréteur Python avec une variable d'environnement PYTHONPATH définie par l'attaquant. En plus de l'utilisation de Python, une attaque peut également être menée (CVE-2024-48992) en lançant l'interpréteur Ruby avec la variable d'environnement RUBYLIB.
Les vulnérabilités sont causées par le fait que lors du redémarrage d'un script modifié, l'outil needrestart définit la variable d'environnement PYTHONPATH sur la base du contenu du fichier /proc/pid/environ, qu'il utilise ensuite également pour exécuter son propre code Python. Ainsi, l'attaquant peut attendre une activité liée au gestionnaire de paquets APT, simuler la modification de son script et définir une variable d'environnement PYTHONPATH qui sera également appliquée lors de l'exécution du code Python intégré dans needrestart (« import sys\n print(sys.path) »), exécuté avec des droits root.
Par exemple, pour exploiter la vulnérabilité, on peut lancer un processus Python qui reste en mémoire de façon permanente en définissant la variable d'environnement «PYTHONPATH=/home/test», et placer la bibliothèque partagée «/home/test/importlib/__init__.so», qui sera exécutée lors de l'exécution du code Python privilégié dans needrestart.
- CVE-2024-48991 — un utilisateur local peut obtenir l'exécution de code avec les droits root en initiant une condition de compétition (race condition), entraînant needrestart à lancer un interprète Python factice, substitué par l'attaquant, au lieu de l'interprète Python système. L'essence de la vulnérabilité est similaire à celle mentionnée ci-dessus, la seule différence étant que needrestart détermine le nom du processus Python (par exemple, /usr/bin/python3) en lisant «/proc/pid/exe».
Pour exploiter la vulnérabilité, on peut créer un processus /home/test/race, qui, à l'aide du mécanisme inotify, attendra le moment où needrestart commencera à lire le contenu de /proc/pid/exe, et lancera immédiatement l'interprète Python système via la fonction execve. Comme needrestart ne vérifie pas si c'est bien Python, il considérera que /home/test/race est l'interprète Python et l'exécutera pour son code.
- CVE-2024-11003 — un utilisateur local peut parvenir à exécuter des commandes shell arbitraires avec les droits root en créant des conditions pour le traitement par needrestart de noms de fichiers au format «commande|», leur passage à la fonction Perl open() entraînant l'exécution de la commande. En fait, la vulnérabilité se manifeste dans le module Perl ScanDeps (CVE-2024-10224), mais est causée par le passage de paramètres externes à ce module sans vérification adéquate.
L'attaque peut être réalisée en lançant un script Perl avec le caractère «|» dans le nom, par exemple, «/home/test/perl|». Au cours de l'exécution de la fonction scan_deps() dans needrestart, ce fichier sera ouvert via la fonction open(), qui traitera le caractère «|» comme un indicateur pour lancer le programme «/home/test/perl» et d'utiliser le flux de sortie obtenu de ce programme.
Source : opennet.ru
