CVE-2026-19737
i2s_esp32_trigger_check() en drivers/i2s/i2s_esp32.c valida la dirección solicitada solo para I2S_DIR_BOTH. Las ramas I2S_DIR_RX e I2S_DIR_TX leen dev_cfg->rx.data->configured / dev_cfg->tx.data->configured sin comprobar primero los punteros de stream. La macro de instancia de dispositivo I2S_ESP32_STREAM_INIT() establece tanto .conf como .data en NULL para una dirección que el devicetree no describe, por lo que en una instancia que cableada solo una dirección — la forma normal para salida de audio o una tira LED worldsemi,ws2812-i2s — la otra dirección desreferencia un puntero NULL en lugar de devolver un error.
Leer descripción completaMostrar menos
i2s_trigger() es una llamada del sistema Zephyr, y z_vrfy_i2s_trigger() en drivers/i2s/i2s_handlers.c valida solo el objeto del dispositivo y la presencia del puntero de API de disparo; el argumento dir se pasa al controlador sin validar. En una compilación con CONFIG_USERSPACE habilitado, un hilo en modo usuario que ha recibido el dispositivo I2S puede emitir una única llamada i2s_trigger() nombrando la dirección no cableada y causar una carga desde la dirección 0 en modo kernel. Entre las piezas Espressif que llevan este controlador, el espacio de usuario está disponible en el árbol solo en SoCs RISC-V con CONFIG_RISCV_PMP, y v4.4.0 es la primera versión donde es compilable: el ESP32-C6 HPCORE selecciona RISCV_PMP cuando no está compilado para MCUboot. ESP32-C5 en v4.4.x lleva el mismo soporte de región PMP y cargador de espacio de usuario, pero no selecciona RISCV_PMP por defecto. Los objetivos Xtensa de Espressif no soportan espacio de usuario de Zephyr, y en una compilación sin espacio de usuario la dirección incorrecta solo puede provenir de código de aplicación en kernel.
El impacto se limita a la disponibilidad: el acceso es una lectura en desplazamiento 0 de la estructura de stream faltante, por lo que no hay desplazamiento controlado por el atacante, no hay primitiva de escritura y no hay divulgación de información. Con el controlador de error fatal por defecto la excepción resultante detiene el sistema, dando a un hilo en modo usuario sin privilegios una denegación de servicio en todo el sistema. La corrección añade la misma comprobación de puntero que la rama I2S_DIR_BOTH ya realizaba y devuelve -ENOSYS para una dirección que la instancia no implementa; los otros puntos de entrada del controlador (i2s_esp32_config_check(), i2s_esp32_config_get(), i2s_esp32_read(), i2s_esp32_write()) ya protegían los punteros, y una auditoría estática no encontró ninguna ruta desprotegida equivalente.
El defecto del controlador es más antiguo que el rango afectado. La desreferencia desprotegida está presente desde v4.2.0 (alcanzada a través de i2s_esp32_trigger_stream(), cuya guardia if (stream) prueba la dirección de un miembro de struct y nunca es falsa) y toma su forma actual i2s_esp32_trigger_check() en v4.3.0. Ninguna configuración Espressif en el árbol anterior a v4.4.0 puede ejecutar un hilo en modo usuario, por lo que en v4.2.x y v4.3.x el argumento de dirección solo puede provenir de código kernel de confianza. Esas versiones llevan el bug pero no están listadas como afectadas; la corrección también ha sido fusionada a v4.3-branch como endurecimiento.
Traducción automática del texto original de NVD (en inglés).
CVSS
- Puntuación base
- 5.5
- Versión
- 3.1
- Vector
- CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
Probabilidad de explotación (EPSS)
- Probabilidad de explotación en los próximos 30 días
- 0.10 %
- Percentil entre todas las CVEs puntuadas
- 1
- Fecha de la puntuación
- 20/10/2026
EPSS (Exploit Prediction Scoring System, de FIRST) estima la probabilidad de que una vulnerabilidad sea explotada en 30 días. Complementa a CVSS (impacto) y a CISA KEV (explotación confirmada).
Técnicas ATT&CK
Cómo se explota esta vulnerabilidad y qué consigue el atacante, en el lenguaje de MITRE ATT&CK.
- Explotación
T1068Exploitation for Privilege Escalationprivilege escalation85 % - Impacto principal
T1499.004Application or System Exploitationimpact90 %
AV:L/PR:L permite escalada: thread no privilegiado causa NULL pointer dereference en kernel. Impacto: DoS del sistema entero (halt).
Inferido por nuestro agente de análisis a partir de la descripción oficial, el vector CVSS y la CWE, y comprobado por un supervisor. Puede contener errores.
Mitigaciones ATT&CK que cubren estas técnicas
Tecnologías afectadas (1)
⚠ Inferidas por IA a partir de la descripción — NVD aún no ha analizado esta CVE; no son CPE verificados.
CWE
- CWE-476
Referencias
JSON original (NVD)
Mostrar
{
"id": "CVE-2026-19737",
"cveTags": [],
"metrics": {
"ssvcV203": [
{
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"ssvcData": {
"id": "CVE-2026-19737",
"role": "CISA Coordinator",
"options": [
{
"exploitation": "none"
},
{
"automatable": "no"
},
{
"technicalImpact": "partial"
}
],
"version": "2.0.3",
"timestamp": "2026-10-16T15:45:22.302843Z"
}
}
],
"cvssMetricV31": [
{
"type": "Secondary",
"source": "vulnerabilities@zephyrproject.org",
"cvssData": {
"scope": "UNCHANGED",
"version": "3.1",
"baseScore": 5.5,
"attackVector": "LOCAL",
"baseSeverity": "MEDIUM",
"vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H",
"integrityImpact": "NONE",
"userInteraction": "NONE",
"attackComplexity": "LOW",
"availabilityImpact": "HIGH",
"privilegesRequired": "LOW",
"confidentialityImpact": "NONE"
},
"impactScore": 3.6,
"exploitabilityScore": 1.8
}
]
},
"affected": [
{
"source": "vulnerabilities@zephyrproject.org",
"affectedData": [
{
"vendor": "zephyrproject",
"product": "zephyr",
"versions": [
{
"status": "affected",
"version": "4.4.0",
"lessThan": "4.5.0",
"versionType": "semver"
}
],
"packageName": "zephyr",
"programFiles": [
"drivers/i2s/i2s_esp32.c"
],
"collectionURL": "https://github.com/zephyrproject-rtos/zephyr",
"defaultStatus": "unaffected",
"programRoutines": [
{
"name": "i2s_esp32_trigger"
},
{
"name": "i2s_esp32_trigger_check"
}
]
}
]
}
],
"published": "2026-10-11T18:16:58.930",
"references": [
{
"url": "https://github.com/zephyrproject-rtos/zephyr/commit/0d82dbbe72f154de32cc45021a9f59d9a737246b",
"source": "vulnerabilities@zephyrproject.org"
},
{
"url": "https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-5g9q-h8wq-rrf3",
"source": "vulnerabilities@zephyrproject.org"
}
],
"vulnStatus": "Awaiting Analysis",
"weaknesses": [
{
"type": "Secondary",
"source": "vulnerabilities@zephyrproject.org",
"description": [
{
"lang": "en",
"value": "CWE-476"
}
]
}
],
"descriptions": [
{
"lang": "en",
"value": "i2s_esp32_trigger_check() in drivers/i2s/i2s_esp32.c validates the requested direction only for I2S_DIR_BOTH. The I2S_DIR_RX and I2S_DIR_TX branches read dev_cfg->rx.data->configured / dev_cfg->tx.data->configured without first checking the stream pointers. The device instantiation macro I2S_ESP32_STREAM_INIT() sets both .conf and .data to NULL for a direction the devicetree does not describe, so on an instance that wires only one direction — the normal shape for audio output or a worldsemi,ws2812-i2s LED strip — the other direction dereferences a NULL pointer instead of returning an error.\n\ni2s_trigger() is a Zephyr syscall, and z_vrfy_i2s_trigger() in drivers/i2s/i2s_handlers.c validates only the device object and the presence of the trigger API pointer; the dir argument is passed to the driver unvalidated. On a build with CONFIG_USERSPACE enabled, a user-mode thread that has been granted the I2S device can issue a single i2s_trigger() call naming the unwired direction and cause a load from address 0 in kernel mode. Among the Espressif parts that carry this driver, userspace is available in-tree only on RISC-V SoCs with CONFIG_RISCV_PMP, and v4.4.0 is the first release where that is buildable: the ESP32-C6 HPCORE selects RISCV_PMP when it is not built for MCUboot. ESP32-C5 in v4.4.x carries the same PMP-region and userspace linker support but does not select RISCV_PMP by default. Espressif Xtensa targets do not support Zephyr userspace, and in a non-userspace build the bad direction can only come from in-kernel application code.\n\nThe impact is limited to availability: the access is a read at offset 0 of the missing stream structure, so there is no attacker-controlled offset, no write primitive and no information disclosure. With the default fatal-error handler the resulting exception halts the system, giving an unprivileged user-mode thread a system-wide denial of service. The fix adds the same pointer check the I2S_DIR_BOTH branch already performed and returns -ENOSYS for a direction the instance does not implement; the driver's other entry points (i2s_esp32_config_check(), i2s_esp32_config_get(), i2s_esp32_read(), i2s_esp32_write()) already guarded the pointers, and a static audit found no equivalent unguarded path.\n\nThe driver defect is older than the affected range. The unguarded dereference is present from v4.2.0 (reached through i2s_esp32_trigger_stream(), whose if (stream) guard tests the address of a struct member and is never false) and takes its present i2s_esp32_trigger_check() form in v4.3.0. No in-tree Espressif configuration before v4.4.0 can run a user-mode thread, so in v4.2.x and v4.3.x the direction argument can only come from trusted kernel code. Those releases carry the bug but are not listed as affected; the fix has also been merged to v4.3-branch as hardening."
}
],
"lastModified": "2026-10-16T16:17:05.303",
"sourceIdentifier": "vulnerabilities@zephyrproject.org"
}