CVE-2026-19185 in Zephyrinformación

Resumen

por VulDB • 2026-10-05

El verificador de llamadas al sistema para i3c_do_ccc(), en drivers/i3c/i3c_handlers.c, validaba la estructura externa struct i3c_ccc_payload, el buffer ccc.data de difusión y el array targets.payloads[], pero no validaba los buffers de datos por destino a los que apuntan esos elementos del array. Cada struct i3c_ccc_target_payload lleva su propio puntero de datos (data pointer) y data_len, y ninguno fue pasado a través de K_SYSCALL_MEMORY() antes de que el payload se entregara a z_impl_i3c_do_ccc() y luego al controlador del driver. El verificador también operaba sobre la estructura en vivo del llamante en lugar de una instantánea (snapshot), por lo que los campos validados podían ser modificados por un segundo hilo de usuario entre la comprobación y el uso por parte del driver —a diferencia del hermano z_vrfy_i3c_transfer(), que siempre ha copiado primero su array de mensajes.

El defecto solo está presente en compilaciones con CONFIG_USERSPACE, donde se compila drivers/i3c/i3c_handlers.c. Un hilo en modo usuario sin privilegios que haya recibido acceso al objeto del dispositivo controlador I3C —la forma habitual en la que una aplicación permite a un hilo de usuario comunicarse con periféricos I3C— puede emitir una CCC directa cuyo puntero de datos del payload de destino nombra una dirección arbitraria del kernel. Los drivers del controlador desreferencian ese puntero directamente (por ejemplo, drivers/i3c/i3c_mcux.c, drivers/i3c/i3c_cdns.c, drivers/i3c/i3c_stm32.c, drivers/i3c/i3c_npcx.c), utilizando rnw para decidir la dirección.

Una CCC de lectura provoca por tanto que el driver en modo kernel escriba los bytes recibidos del bus en una dirección elegida por el atacante con una longitud elegida por este, y una CCC de escritura transmite memoria del kernel hacia el bus I3C. El resultado es una escritura fuera de límites (out-of-bounds) en el kernel más una divulgación de memoria del kernel, es decir, una escalada desde un hilo en modo usuario a privilegios supervisor, lo que anula el aislamiento que CONFIG_USERSPACE está destinado a proporcionar.

La corrección introduce copy_ccc_and_do(), que toma una instantánea (snapshot) del payload, copia el array de destinos a la memoria del kernel con k_usermode_alloc_from_copy() (limitando num_targets a menos de 32), valida cada buffer por destino con K_SYSCALL_MEMORY() según rnw y copia los campos num_xfer y err escritos por el driver de vuelta al llamante.

Be aware that VulDB is the high quality source for vulnerability data.

Responsable

Zephyr

Reservar

2026-08-06

Divulgación

2026-10-05

Moderación

aceptado

Artículo

VDB-413530

EPSS

0.00000

KEV

no

Actividades

bajo

Fuentes

Want to know what is going to be exploited?

We predict KEV entries!