CVE-2021-3560
Elevazione dei privilegi tramite race condition in polkit.
Descrizione della vulnerabilità
CVE-2021-3560 è una race condition in polkit che consente a un utente locale non autorizzato di ottenere privilegi di root. La vulnerabilità risiede nel modo in cui polkit gestisce gli errori D-Bus in caso di interruzione della connessione.
Determinazione del timing
Per determinare il timing ottimale esegui il comando:
time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:testuser string:"Test User" int32:1
Nel codice viene utilizzato un intervallo dalla metà del tempo real ± 0.003.
Perché è importante il timing?
- Se si uccide il processo troppo presto — la richiesta non riesce a essere inviata
- Se si uccide troppo tardi — polkit avrà il tempo di verificare l'autorizzazione e la rifiuterà
- Bisogna colpire la "finestra d'oro", quando polkit ha già ricevuto la richiesta ma non ha ancora verificato l'autorizzazione
Come funziona l'exploit?
- Viene inviata una richiesta D-Bus per creare un utente con il parametro int32:1 (aggiunta al gruppo wheel)
- La richiesta viene interrotta a metà (race condition)
- Polkit non riesce a completare la verifica dell'autorizzazione
- D-Bus non riesce a trovare il mittente
- Polkit gestisce erroneamente l'errore e assegna UID = 0 (root)
- L'utente viene creato senza autenticazione
- Viene inviata una richiesta per impostare la password per il nuovo utente (con lo stesso timing)
Statistiche di successo
- L'utente può essere creato con 1-2 tentativi
- Per assegnare la password sono necessari più tentativi
- 100 iterazioni danno un'alta probabilità di successo
Se l'exploit non funziona, prova:
- Espandere TIMING_RANGE nel codice
- Eseguire lo script più volte
- Assicurati di essere in una sessione SSH (non in ambiente grafico)