CVE-2026-64560
posix-cpu-timers: Prevenir UAF causado por la carrera exec() de no-líder
- Publicado
- 29 jul 2026
- Actualizado
- 8 sept 2026
- Asignación de CNA
- Linux
- Evidencia observada
- 10 ago 2026
posix-cpu-timers: Prevenir UAF causado por la carrera exec() de no-líder
nvd · CVSS 3.1
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:HBajo · próximos 30 días
EPSS es una estimación estadística, no una certeza o una medida de impacto. Combínelo con CVSS, estado KEV, exposición y su entorno.
En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: posix-cpu-timers: Prevenir UAF causado por la carrera de exec() de no líder Wongi y Jungwoo decodificaron y reportaron una carrera relacionada con exec() de no líder que puede resultar en un UAF: sys_timer_delete() exec() posix_cpu_timer_del() // Observa al antiguo líder p = pid_task(pid, pid_type); de_thread() switch_leader(); release_task(old_leader) __exit_signal(old_leader) sighand = lock(old_leader, sighand); posix_cpu_timers*_exit(); sighand = lock_task_sighand(p) unhash_task(old_leader); sh = lock(p, sighand) old_leader->sighand = NULL; unlock(sighand); (p->sighand == NULL) unlock(sh) return NULL; // Retorna sin acción if(!sighand) return 0; free_posix_timer(); Esto es "inofensivo" a menos que el temporizador eliminado estuviera armado y encolado en p->signal porque en exec() un temporizador dirigido a TGID se hereda. Como sys_timer_delete() liberó el objeto de temporizador posix subyacente, run_posix_cpu_timers() o cualquier operación de agregar/eliminar relacionada con timerqueue en otros temporizadores accederá al nodo timerqueue del objeto liberado, lo que resulta en un UAF. Hay un problema similar con posix_cpu_timer_set(). Para temporizadores posix regulares, simplemente retorna -ESRCH transitoriamente al espacio de usuario, pero para el caso de uso en do_cpu_nanosleep() es el mismo UAF solo que el k_itimer se asigna en la pila. Además, posix_cpu_timer_rearm() no logra rearmar el temporizador, lo que significa que deja de expirar. Mientras se debatían soluciones, Frederic señaló otro problema: posix_cpu_timer_del(tmr) __exit_signal(p) posix_cpu_timers*_exit(p); unhash_task(p); p->sighand = NULL; sh = lock_task_sighand(p) sighand = p->sighand; if (!sighand) return NULL; lock(sighand); if (!sh) WARN_ON_ONCE(timer_queued(tmr)); En arquitecturas con ordenamiento débil, no se garantiza que posix_cpu_timer_del() observe los almacenamientos en posix_cpu_timers*_exit() cuando p->sighand se observa como NULL, lo que significa que el WARN() puede ser un falso positivo. Resuelva estos problemas mediante: 1) Cambiar el almacenamiento en __exit_signal() a smp_store_release(). 2) Agregar un smp_acquire__after_ctrl_dep() en la ruta !sighand de lock_task_sighand(). 3) Crear una función auxiliar para buscar la tarea y bloquear sighand que no retorna cuando sighand == NULL. En su lugar, reintenta la búsqueda de la tarea y solo si eso falla se rinde. 4) Usar esa función auxiliar en las tres funciones afectadas. #1/#2 asegura que el lado del lector que observa sighand == NULL también observe todos los almacenamientos precedentes, es decir, los almacenamientos en posix_cpu_timers*_exit() y los de unhash_task(). #3 asegura que la situación de exec() de no líder descrita anteriormente se maneje con elegancia. Cuando la búsqueda de la tarea retorna al antiguo líder, pero sighand == NULL, entonces reintenta. En el caso de exec() de no líder, la búsqueda posterior de la tarea observará al nuevo líder debido a #1/#2. En escenarios normales de exit(), la búsqueda posterior falla. Cuando la búsqueda de la tarea falla, la función también verifica si el temporizador sigue encolado y emite una advertencia si ese es el caso. Desafortunadamente, no hay nada que se pueda hacer al respecto, pero como la tarea ya no es visible, el temporizador no debería ser accedido más. Esta verificación también requiere ordenamiento de memoria, que no se proporciona cuando la primera búsqueda falla. Para lograrlo, la verificación está precedida por un smp_rmb() que se empareja con el smp_wmb() en write_seqlock() en __exit_signal(). Eso asegura que los almacenamientos en posix_cpu_timers*_exit() sean visibles. La historia del problema de exec() de no líder se remonta a los primeros días de los temporizadores CPU posix, que almacenaban un puntero a la tarea del líder del grupo en el temporizador. Eso obviamente falla cuando un exec() de no líder cambia al líder. el commit e0a70217107e ("posix-cpu-timers: workaround to suppress the problems with mt exec") agregó una solución temporal para eso en 2010 que sobrev ---truncado---
Análisis de UAF en el kernel de Linux para CVE-2026-64560 con PoC de activación por condición de carrera, revisión del parche, matriz de versiones LTS/Android afectadas y autocomprobación para dispositivos parcheados.
Adaptación de CVE-2026-64560 vinculada al dispositivo para RedMi K80pro miro OS 3.0.304.0
Adaptación del CVE-2026-64560 vinculado al dispositivo para Xiaomi 15 dada OS4.0.0.8
CVE research and exploits to help gaining roots for Pixel devices
Utilice información sobre vulnerabilidades solo en sistemas de su propiedad o que esté autorizado a probar. Kitploit enlaza con metadatos de investigación pública y no almacena código de explotación ni cargas útiles maliciosas.