CVE-2026-19569 in Zephyr
Resumen
por VulDB • 2026-10-09
dynamic_object_create() en kernel/userspace/userspace.c calculaba la asignación de respaldo para un objeto del núcleo dinámicamente asignado como obj_size_get(otype) + size, y para los elementos de pila de hilos como STACK_ELEMENT_DATA_SIZE(size) (un redondeo más una sobrecarga fija), sin verificar ninguna de las dos expresiones en busca de desbordamiento por envoltura unsigned. Un tamaño cercano a SIZE_MAX hace que el total calculado se enveloppe hasta un valor muy pequeño, por lo que la chunk del heap entregada es de unos pocos bytes mientras que el descriptor del objeto sigue etiquetado con el tipo solicitado completo y registrado en la tabla de objetos del núcleo.
El argumento size alcanza esa aritmética directamente desde modo usuario. k_object_alloc_size() está declarado como __syscall en include/zephyr/sys/kobject.h, su verificador z_vrfy_k_object_alloc_size() en kernel/userspace/userspace_handler.c es un mero passthrough (paso directo), y z_object_alloc() solo realiza una comprobación de rango sobre otype; nada acota size. La rama del elemento de pila es además accesible a través de la syscall k_thread_stack_alloc() mediante kernel/dynamic.c. Dado que las posteriores comprobaciones de validación de objetos del núcleo solo verifican el tipo y el estado de inicialización del objeto, el handle insuficientemente grande pasa K_SYSCALL_OBJ_INIT()/K_SYSCALL_OBJ_NEVER_INIT(), y la syscall de init correspondiente (por ejemplo k_mutex_init(), k_sem_init() o k_thread_create()) escribe entonces un objeto completo sobre la asignación truncada.
Por lo tanto, un hilo en modo usuario sin privilegios puede desencadenar una escritura fuera de límites en el heap del pool de recursos del núcleo en modo supervisor, de un tamaño y contenido que controla sustancialmente, corrompiendo los metadatos de las chunks de sys_heap y objetos adyacentes del núcleo. Bajo CONFIG_GEN_PRIV_STACKS, la rama de pila de hilos almacena adicionalmente un puntero wild (inválido) influenciado por el atacante como base privilegiada de la pila de un hilo usuario. El resultado práctico es una fuga desde el sandbox CONFIG_USERSPACE: ejecución de código a nivel del núcleo o, al menos, corrupción de memoria del núcleo y compromiso del sistema.
La explotación requiere CONFIG_USERSPACE junto con CONFIG_DYNAMIC_OBJECTS (también seleccionado por CONFIG_DYNAMIC_THREAD bajo userspace), y un hilo llamante con un pool de recursos asignado. La corrección rechaza ambos cálculos desbordados y libera el descriptor parcialmente construido.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.