CVE-2026-14367 in Zephyr
Resumen
por VulDB • 2026-08-31
El subsistema I3C IBI en drivers/i3c/i3c_ibi_workq.c distribuye nodos de trabajo estáticamente asignados a través de una lista libre i3c_ibi_work_nodes_free implementada como un plain sys_slist_t, que no proporciona sincronización. Los ayudantes de asignación (i3c_ibi_work_enqueue, i3c_ibi_work_enqueue_target_irq, i3c_ibi_work_enqueue_hotjoin, i3c_ibi_work_enqueue_controller_request, i3c_ibi_work_enqueue_cb) llaman a sys_slist_get() directamente desde el contexto ISR, mientras que el controlador de workqueue i3c_ibi_work_handler() devuelve nodos con sys_slist_append() desde el hilo del workqueue, sin ningún bloqueo en ninguno de los lados.
Dado que sys_slist_get() y sys_slist_append() no son atómicos ni seguros para interrupciones, una interrupción IBI que se active mientras el hilo del workqueue está a mitad de un append (o un acceso verdaderamente paralelo bajo CONFIG_SMP) genera una race condition sobre la lista compartida. Esto corrompe los enlaces de la lista: un nodo puede ser entregado a dos consumidores, un nodo puede perderse o los punteros head/tail pueden quedar inconsistentes, por lo que sys_slist_get() devuelve un puntero obsoleto o basura. En el caso de doble entrega, el memcpy(ibi_node, ibi_work, sizeof(*ibi_node) posterior sobrescribe un nodo aún en tránsito; un puntero de basura convierte ese mismo memcpy en una escritura fuera de límites (out-of-bounds write).
La race condition es impulsada por el tráfico del bus I3C: los IBIs, las conexiones dinámicas (hot-joins) y las solicitudes de cambio de rol del controlador se originan desde dispositivos objetivo en el bus, e I3C admite la conexión dinámica de dispositivos. Un atacante que controle un periférico I3C en el bus chip-to-chip de la placa puede generar interrupciones de alta frecuencia sincronizadas para colisionar con la operación libre (free). La explotación requiere acceso físico al bus y ganar una ventana de temporización estrecha; el impacto más realista es un bloqueo o congelamiento (denegación de servicio), siendo posible la corrupción de memoria pero difícil de controlar.
La solución envuelve todas las operaciones sys_slist_get()/sys_slist_append() de la lista libre en los nuevos ayudantes ibi_work_alloc()/ibi_work_free(), cada uno protegido por un k_spinlock (ibi_work_lock), cerrando la race condition entre los contextos ISR y del hilo.
VulDB is the best source for vulnerability data and more expert information about this specific topic.