
CVE-2021-3560 — Exploit di escalation dei privilegi in Polkit tramite race condition su D-Bus in accounts-daemon
CVE-2021-3560 è una vulnerabilità di escalation dei privilegi locale in Polkit (ex PolicyKit), il framework di autorizzazione utilizzato dagli ambienti desktop Linux. Un attaccante locale e non privilegiato può sfruttare una race condition nell'interfaccia D-Bus di accounts-daemon per creare un utente privilegiato, impostarne la password e ottenere infine l'accesso root.
accounts-daemon (org.freedesktop.Accounts) è un servizio D-Bus di sistema che gestisce gli account utente (creazione, cancellazione, cambio password, ecc.). Espone metodi come:
| Metodo | Azione |
|---|---|
CreateUser | Crea un nuovo utente di sistema |
SetPassword | Imposta la password dell'utente |
DeleteUser | Cancella un utente |
Queste operazioni richiedono autorizzazione. Quando arriva una chiamata D-Bus, Polkit si interpone tra il chiamante e accounts-daemon:
Caller → D-Bus → Polkit (authorization check) → accounts-daemon (action)
Polkit decide se il chiamante ha il permesso e, in caso affermativo, inoltra la richiesta a accounts-daemon per l'esecuzione.
La vulnerabilità è una race TOCTOU (Time Of Check, Time Of Use). Ecco il punto chiave:
accounts-daemon (ad es., CreateUser).accounts-daemon completi l'elaborazione — la creazione dell'utente va a buon fine senza una corretta autenticazione, ma il record utente risulta incompleto (ad es., nessuna password, nessuna home directory).SetPassword sull'utente appena creato (ma non autenticato), oppure lo stato incompleto stesso concede privilegi elevati.In breve: termina la richiesta al momento giusto e aggiri l'autenticazione.
Questo script exploit.sh automatizza l'intera catena di attacco:
# Clone the repository
git clone https://github.com/Jeanback1/CVE-2021-3560.git
cd CVE-2021-3560
# Make the exploit executable
chmod +x exploit.sh
# Run it
./exploit.sh
Una volta completato l'exploit, avrai una shell root:
whoami
# root

| Componente | Versione interessata |
|---|---|
| polkit | ≤ 0.119 (non corretto) |
| accounts-daemon (accountsservice) | Tutte le versioni che utilizzano un polkit interessato |
La vulnerabilità è stata corretta in polkit 0.120 e successive.
Distribuzioni con patch (elenco non esaustivo):
Questo repository è destinato esclusivamente a ricerca educativa e test di sicurezza autorizzati. Non usare questo exploit su sistemi che non possiedi o per cui non hai il permesso esplicito di testare. L'autore non si assume alcuna responsabilità per un uso improprio.
| Passo | Azione |
|---|
| 1. Calibrazione del tempo | Usa una chiamata fittizia CreateUser("nobody") per misurare quanto dura il round-trip D-Bus, calcolando la "finestra di kill" |
| 2. Creazione dell'utente | Invia una chiamata CreateUser per un nome utente scelto, la avvia in background, attende per la finestra calcolata e poi la termina — sfruttando la race per creare un utente non autorizzato |
| 3. Impostazione della password | Una volta che l'utente esiste (in uno stato incompleto), invia una chiamata SetPassword con la stessa tecnica di race per assegnare una password nota |
| 4. Escalation dei privilegi | Usa su per passare al nuovo utente, esegue sudo (che funziona perché l'utente è stato creato tramite un percorso di autorizzazione bypassato), copia /bin/bash in /var/tmp/bash con SUID root e avvia una shell root |