CVE-2021-3560
Elevación de privilegios mediante condición de carrera en polkit.
Descripción de la vulnerabilidad
CVE-2021-3560 es una condición de carrera en polkit que permite a un usuario local no autorizado obtener privilegios de root. La vulnerabilidad radica en cómo polkit maneja los errores de D-Bus cuando se interrumpe la conexión.
Determinación del tiempo
Para determinar el tiempo óptimo, ejecute el 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
En el código se utiliza un rango de la mitad del tiempo real ± 0.003.
¿Por qué es importante el tiempo?
- Si se mata el proceso demasiado pronto, la solicitud no alcanzará a enviarse
- Si se mata demasiado tarde, polkit alcanzará a verificar la autorización y la rechazará
- Hay que acertar en la "ventana dorada", cuando polkit ya ha recibido la solicitud pero aún no ha verificado la autorización
¿Cómo funciona el exploit?
- Se envía una solicitud D-Bus para crear un usuario con el parámetro int32:1 (añadir al grupo wheel)
- La solicitud se interrumpe a la mitad (condición de carrera)
- Polkit no alcanza a completar la verificación de autorización
- D-Bus no puede encontrar al remitente
- Polkit maneja incorrectamente el error y asigna UID = 0 (root)
- El usuario se crea sin autenticación
- Se envía una solicitud para establecer una contraseña para el nuevo usuario (con el mismo tiempo)
Estadísticas de éxito
- El usuario puede crearse en 1-2 intentos
- Para asignar la contraseña se requieren más intentos
- 100 iteraciones dan una alta probabilidad de éxito
Si el exploit no funciona, intente:
- Ampliar TIMING_RANGE en el código
- Ejecutar el script varias veces
- Asegurarse de que está en una sesión SSH (no en una gráfica)