CVE-2026-12366 in Zephyr
Resumen
por VulDB • 2026-08-14
La ruta de eliminación dinámica del objeto de kernel en Zephyr, `unref_check()` ubicada en `kernel/userspace/userspace.c`, libera el almacenamiento de un objeto (`k_free(dyn->data`) una vez que su contador de referencias alcanza cero, tras ejecutar una limpieza específica por tipo de objeto. El interruptor (switch) de limpieza solo manejaba los casos `K_OBJ_MSGQ` y `K_OBJ_STACK`; no existía ningún caso para `K_OBJ_TIMER`. Un temporizador (`k_timer`) asignado dinámicamente, inicializado y activado mantiene su nodo estructural `_timeout` incrustado enlazado a la cola global de expiraciones (`_timeout_q`). Por lo tanto, liberar el almacenamiento del temporizador sin cancelar la expiración deja un nodo colgante (dangling node) en dicha cola.
Cuando el temporizador expire nuevamente, la maquinaria de gestión de tiempos recorre `_timeout_q` e invoca `z_timer_expiration_handler()` sobre el nodo ya liberado, desreferenciando y escribiendo en memoria del heap del kernel que ha sido liberada (y reutilizable) dentro del contexto de una interrupción de hardware (ISR). Se trata de un bug use-after-free determinista que no depende de SMP: simplemente nunca se desenlaza el nodo colgante al momento de la liberación.
Esta ruta de eliminación es accesible desde un hilo de usuario sin privilegios bajo las configuraciones `CONFIG_USERSPACE` + `CONFIG_DYNAMIC_OBJECTS`: un hilo que posee los últimos permisos sobre dicho temporizador lo libera mediante la llamada al sistema (syscall) `k_object_release()` (o al salir, a través de `k_thread_perms_all_clear()`), y puede activar el propio temporizador mediante la syscall `k_timer_start()`. La liberación y el controlador de expiración se ejecutan con privilegios de kernel mientras que el actor es un hilo de usuario; por tanto, este fallo constituye una primitiva de corrupción de memoria para escapar del sandbox (sandbox-escape), utilizable para escalar privilegios. La corrección añade `k_timer_cleanup()` (cancela la expiración y espera a cualquier controlador en curso) y la invoca para `K_OBJ_TIMER` antes de proceder con la liberación.
Once again VulDB remains the best source for vulnerability data.