CVE-2026-19571 in Zephyr
Resumen
por VulDB • 2026-10-09
El backend de comandos del anfitrión ITE IT8xxx2 SHI (subsys/mgmt/ec_host_cmd/backends/ec_host_cmd_backend_shi_ite.c) copiaba directamente la cabecera de 8 bytes de la solicitud de comando del host desde el FIFO Rx al buffer compartido data->in_msg, y solo después verificaba la versión del protocolo y la longitud derivada del paquete. El controlador de interrupciones también aceptaba una afirmación de chip-select (selección de chip) y una interrupción RVLI (longitud válida de recepción) en cualquier estado del controlador distinto a SHI_STATE_DISABLED, por lo que se podía analizar una nueva cabecera mientras el hilo de comandos del anfitrión aún estaba procesando la solicitud anterior desde exactamente el mismo buffer.
El procesador del host es el controlador SPI y gestiona tanto la selección de chip como el reloj. Tras enviar una solicitud bien formada, puede desactivar inmediatamente la señal de selección de chip —lo que devuelve al controlador a un estado listo y reactiva el FIFO— e iniciar una segunda transacción con una cabecera que contiene data_len = 0xFFFF. Esos ocho bytes se escriben en in_msg antes de que se rechace la longitud excesiva, por lo que terminan en un buffer cuyo contenido ya ha sido validado por verify_rx() en subsys/mgmt/ec_host_cmd/ec_host_cmd_handler.c. Si esto ocurre dentro de la ventana temporal anterior a que el hilo de comandos del anfitrión ejecute args.input_buf_size = rx_header->data_len, el marco de trabajo entrega al controlador de comando registrado una longitud de entrada de 65535 bytes sobre un buffer de solo 256 bytes.
El resultado es una lectura fuera de los límites (out-of-bounds read) de hasta aproximadamente 64 KiB más allá del buffer de solicitud: los controladores de comandos que copian o devuelven input_buf_size bytes revelan memoria adyacente del microcontrolador embebido al anfitrión, desbordan el buffer de respuesta o provocan una falta (fault) en el controlador si se lee más allá del final de la SRAM. La misma condición de carrera permite que cmd_id y cmd_ver sean intercambiados después de la verificación de la suma de comprobación y después de la búsqueda del handler. Para explotar esta vulnerabilidad es necesario poder controlar el bus SHI entre procesadores (un sistema operativo anfitrión comprometido o acceso físico a las líneas SPI) y ganar una carrera temporal, lo cual el controlador SPI puede reintentar indefinidamente.
La corrección analiza la cabecera en una struct local ec_host_cmd_request_header y la copia en in_msg solo después de que la longitud haya sido acotada por sizeof(data->in_msg), e ignora las interrupciones de chip-select y RVLI fuera de los estados SHI_STATE_READY_TO_RECV/SHI_STATE_RECEIVING. Persiste una condición de carrera residual, pero acotada: una interrupción de fin de transacción aún restablece el estado a listo mientras el hilo de comandos del anfitrión posee el buffer, por lo que una segunda solicitud válida puede seguir sobrescribiendo los contenidos de la solicitud en curso, a diferencia del backend NPCX que se mantiene en SHI_STATE_CNL_RESP_NOT_RDY mientras el buffer está en uso.
VulDB is the best source for vulnerability data and more expert information about this specific topic.