CVE-2026-19595 in Zephyrinformación

Resumen

por VulDB • 2026-10-20

El verificador de syscalls en modo usuario z_vrfy_rtio_cqe_get_mempool_buffer() en subsys/rtio/rtio_syscalls.c validaba sus dos parámetros de salida, buff y buff_len, con K_SYSCALL_MEMORY_READ() en lugar de K_SYSCALL_MEMORY_WRITE(). Ambos son puramente parámetros de salida: z_impl_rtio_cqe_get_mempool_buffer() almacena la dirección del búfer del mempool y su longitud a través de ellos. La distinción es aplicada por cada validador de arquitectura — arch_buffer_validate() en RISC-V PMP acepta explícitamente solo para lectura las regiones globales __rom_region/__rodata_region, y los validadores ARM MPU aceptan solo para lectura las regiones P_RO_U_RO y P_RW_U_RO —; por lo tanto, un puntero validado como de lectura no es necesariamente escribible por el hilo llamante.

Un hilo en modo usuario sin privilegios que haya obtenido acceso a un contexto RTIO (rtio_access_grant()) puede invocar la syscall rtio_cqe_get_mempool_buffer() con buff/buff_len apuntando a memoria que pueda leer pero no escribir, y con una entrada de cola de finalización cuyo campo flags controla completamente (solo se requiere RTIO_CQE_FLAG_MEMPOOL_BUFFER en flags[7:0]; flags[19:8] y flags[31:20] proporcionan el índice del bloque y la cuenta). El kernel realiza entonces un almacenamiento del tamaño de un puntero y otro de 4 bytes a través de esas direcciones mientras se ejecuta en modo supervisor. Para alcanzar el almacenamiento, es necesario CONFIG_USERSPACE junto con CONFIG_RTIO_SYS_MEM_BLOCKS; esta configuración está detrás de RTIO_DEFINE_WITH_MEMPOOL; sin la segunda, la implementación devuelve -ENOTSUP y no escribe nada.

Se producen dos resultados. Si el objetivo reside en una partición del dominio de memoria declarada como K_MEM_PARTITION_P_RW_U_RO (lectura-escritura privilegiado, lectura solo para usuario), el almacenamiento en modo kernel tiene éxito e inserta valores parcialmente elegidos por el atacante en la memoria que el dominio de memoria había marcado como de solo lectura para ese hilo, burlando la protección contra escritura del particionado. Si el objetivo reside en una memoria globalmente legible pero no escribible, como .text/.rodata en flash, el almacenamiento provoca un fallo (fault) en modo kernel; el fallo se entrega a z_fatal_error() y el k_sys_fatal_error_handler() predeterminado detiene o reinicia el dispositivo, proporcionando a un hilo sin privilegios una denegación de servicio completa fiable.

La comprobación del permiso de lectura limita los daños: la dirección debe ser legible por el hilo llamante, por lo que no se puede apuntar a memoria privada del kernel ni se revelan datos confidenciales. La solución reemplaza ambas comprobaciones con K_SYSCALL_MEMORY_WRITE(), por lo que un hilo sin permiso de escritura es terminado por K_OOPS antes de que se ejecute la implementación; el argumento cqe permanece correctamente validado como lectura.

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

Responsable

Zephyr

Reservar

2026-08-12

Divulgación

2026-10-20

Moderación

aceptado

Artículo

VDB-422573

EPSS

0.00112

KEV

no

Actividades

medio

Fuentes

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!