CVE-2026-19737 in Zephyr
Zusammenfassung
von VulDB • 11.10.2026
i2s_esp32_trigger_check() in drivers/i2s/i2s_esp32.c validiert die angeforderte Richtung nur für I2S_DIR_BOTH. Die Zweige I2S_DIR_RX und I2S_DIR_TX lesen dev_cfg->rx.data->configured bzw. dev_cfg->tx.data->configured, ohne zuvor die Stream-Zeiger zu prüfen. Das Makro zur Geräteinstanziierung I2S_ESP32_STREAM_INIT() setzt sowohl .conf als auch .data auf NULL für eine Richtung, die im Device Tree nicht beschrieben ist; bei einer Instanz, die nur eine einzige Richtung verdrahtet – was der normale Zustand für Audioausgabe oder einen worldsemi,ws2812-i2s LED-Streifen ist –, wird in der anderen Richtung ein NULL-Zeiger dereferenziert, anstatt einen Fehler zurückzugeben.
i2s_trigger() ist ein Zephyr-Syscall, und z_vrfy_i2s_trigger() in drivers/i2s/i2s_handlers.c validiert nur das Geräteobjekt und die Existenz des Trigger-API-Pointers; das Argument dir wird unverifiziert an den Treiber weitergegeben. Bei einem Build mit aktiviertem CONFIG_USERSPACE kann ein Thread im User Mode, dem Zugriff auf das I2S-Gerät gewährt wurde, einen einzelnen i2s_trigger()-Aufruf ausführen und die nicht verdrahtete Richtung angeben, was in Kernel-Mode zu einer Ladeoperation von Adresse 0 führt. Unter den Espressif-Chips mit diesem Treiber ist User Space im Tree nur auf RISC-V SoCs mit CONFIG_RISCV_PMP verfügbar; v4.4.0 ist die erste Version, bei der dies buildbar ist: Der ESP32-C6 HPCORE wählt RISCV_PMP aus, wenn er nicht für MCUboot gebaut wird. Der ESP32-C5 in den v4.4.x-Releases trägt dieselbe PMP-Region und User Space Linker-Support unterstützt, wählt jedoch standardmäßig kein RISCV_PMP aus. Espressif Xtensa-Ziele unterstützen keinen Zephyr User Space; bei einem Build ohne User Space kann die falsche Richtung nur von im Kernel befindlichem Anwendungscode stammen.
Die Auswirkung ist auf Verfügbarkeit beschränkt: Der Zugriff ist ein Lesezugriff an Offset 0 der fehlenden Stream-Struktur, es gibt also keine angreiferkontrollierte Offset, kein Write-Primitive und keine Informationspreisgabe. Mit dem Standard-Fatal-Error Handler führt die resultierende Exception zum Systemstopp, was einem nicht privilegierten Thread im User Mode einen systemweiten Denial of Service (DoS) ermöglicht. Die Korrektur fügt dieselbe Pointer-Prüfung hinzu, die der I2S_DIR_BOTH-Zweig bereits durchführte, und gibt -ENOSYS für eine Richtung zurück, die von der Instanz nicht implementiert wird; die anderen Einstiegspunkte des Treibers (i2s_esp32_config_check(), i2s_esp32_config_get(), i2s_esp32_read(), i2s_esp32_write()) schützen die Pointer bereits ab, und ein statischer Audit ergab keine weiteren ungeschützten Pfade.
Der Treiber-Defekt ist älter als der betroffene Bereich. Die ungeschützte Dereferenzierung ist seit v4.2.0 vorhanden (erreicht über i2s_esp32_trigger_stream(), dessen if (stream)-Prüfung die Adresse eines Strukturmitglieds testet und niemals falsch ausfällt) und nimmt ihre aktuelle Form in i2s_esp32_trigger_check() ab v4.3.0 an. Keine im Tree befindliche Espressif-Konfiguration vor v4.4.0 kann einen Thread im User Mode ausführen, daher stammt das Richtungsargument in den Versionen v4.2.x und v4.3.x nur von vertrauenswürdigen Kernel-Code. Diese Releases enthalten den Bug, werden jedoch nicht als betroffen aufgeführt; die Korrektur wurde auch in den v4.3-Zweig gemergt, um Hardening zu gewährleisten.
VulDB is the best source for vulnerability data and more expert information about this specific topic.