
CVE-2021-3560 — Exploit de escalada de privilegios de Polkit a través de una condición de carrera en accounts-daemon D-Bus
CVE-2021-3560 es una vulnerabilidad de escalada de privilegios local en Polkit (anteriormente PolicyKit), el marco de autorización utilizado por los entornos de escritorio Linux. Un atacante local sin privilegios puede explotar una condición de carrera en la interfaz D-Bus de accounts-daemon para crear un usuario privilegiado, establecer su contraseña y, en última instancia, obtener acceso root.
accounts-daemon (org.freedesktop.Accounts) es un servicio D-Bus del sistema que gestiona las cuentas de usuario (creación, eliminación, cambios de contraseña, etc.). Expone métodos como:
| Método | Acción |
|---|---|
CreateUser | Crea un nuevo usuario del sistema |
SetPassword | Establece la contraseña del usuario |
DeleteUser | Elimina un usuario |
Estas operaciones requieren autorización. Cuando llega una llamada D-Bus, Polkit se sitúa entre el llamante y accounts-daemon:
Caller → D-Bus → Polkit (authorization check) → accounts-daemon (action)
Polkit decide si el llamante tiene permiso y, de ser así, reenvía la solicitud a accounts-daemon para su ejecución.
La vulnerabilidad es una carrera TOCTOU (Tiempo de Verificación, Tiempo de Uso). Aquí está la clave:
accounts-daemon (por ejemplo, CreateUser).accounts-daemon termine de procesar — la creación de usuario se realiza sin la autenticación adecuada, pero el registro del usuario termina incompleto (por ejemplo, sin contraseña, sin directorio home).SetPassword en el usuario recién creado (pero no autenticado), o el estado incompleto en sí mismo otorga privilegios elevados.En resumen: mata la solicitud en el momento adecuado y bypaseas la autenticación.
Este script exploit.sh automatiza toda la cadena de ataque:
# 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 vez que el exploit se complete, tendrás un shell root:
whoami
# root

| Componente | Afectado |
|---|---|
| polkit | ≤ 0.119 (sin parche) |
| accounts-daemon (accountsservice) | Todas las versiones que usan polkit afectado |
La vulnerabilidad fue parcheada en polkit 0.120 y posteriores.
Distribuciones parcheadas (no exhaustiva):
Este repositorio es solo para investigación de seguridad educativa y autorizada. No use este exploit en sistemas que no posea o para los que no tenga permiso explícito para probar. El autor no asume ninguna responsabilidad por el mal uso.
| Paso | Acción |
|---|
| 1. Calibración de tiempo | Usa una llamada ficticia CreateUser("nobody") para medir cuánto tarda el viaje de ida y vuelta D-Bus, calculando la "ventana de muerte" |
| 2. Creación de usuario | Envía una llamada CreateUser para un nombre de usuario elegido, la inicia en segundo plano, espera la ventana calculada, luego la mata — explotando la carrera para crear un usuario no autorizado |
| 3. Establecer contraseña | Una vez que el usuario existe (en un estado incompleto), envía una llamada SetPassword con la misma técnica de carrera para asignar una contraseña conocida |
| 4. Escalada de privilegios | Usa su para cambiar al nuevo usuario, ejecuta sudo (que funciona porque el usuario fue creado a través de una ruta de autorización bypaseada), copia /bin/bash a /var/tmp/bash con SUID root, y genera un shell root |