CVE-2026-19737 in Zephyr
Сводка
по VulDB • 12.10.2026
Функция `i2s_esp32_trigger_check()` в файле `drivers/i2s/i2s_esp32.c` проверяет запрошенное направление только для случая `I2S_DIR_BOTH`. В ветках кода `I2S_DIR_RX` и `I2S_DIR_TX` происходит обращение к полям `dev_cfg->rx.data->configured` / `dev_cfg->tx.data->configured` без предварительной проверки указателей на потоки (stream pointers). Макрос инстанцирования устройства `I2S_ESP32_STREAM_INIT()` устанавливает значения `.conf` и `.data` в NULL для направления, которое не описано в devicetree. Следовательно, при использовании экземпляра, подключенного только к одному направлению — что является стандартной конфигурацией для аудиовыхода или светодиодных лент `worldsemi,ws2812-i2s` — обращение к другому направлению приводит к разыменованию нулевого указателя (NULL pointer dereference) вместо возврата ошибки.
Функция `i2s_trigger()` является системным вызовом Zephyr, а функция `z_vrfy_i2s_trigger()` в файле `drivers/i2s/i2s_handlers.c` проверяет только объект устройства и наличие указателя на API trigger; аргумент `dir` передается драйверу без дополнительной проверки. В сборке с включенным параметром `CONFIG_USERSPACE` поток пользовательского режима (user-mode thread), которому предоставлен доступ к устройству I2S, может выполнить один вызов `i2s_trigger()`, указав неподключенное направление, что приведет к загрузке данных по адресу 0 в режиме ядра. Среди чипов Espressif с данным драйвером пользовательский режим доступен только для SoC на архитектуре RISC-V с параметром `CONFIG_RISCV_PMP`; версия v4.4.0 является первой релизной версией, где такая конфигурация может быть собрана: ESP32-C6 HPCORE выбирает RISCV_PMP, если он не собирается для MCUboot. ESP32-C5 в ветке v4.4.x поддерживает те же области PMP и поддержку линкера пользовательского режима, но по умолчанию не включает RISCV_CV_PMP. Целевые платформы Xtensa от Espressif не поддерживают Zephyr userspace; в сборках без поддержки пользователей (non-userspace build) ошибка может возникать только из кода приложений ядра.
Влияние ограничивается доступностью: обращение представляет собой чтение по смещению 0 отсутствующей структуры потока, поэтому у атакующего нет контроля над смещением, нет примитива записи и возможности утечки информации. При обработчике ошибок по умолчанию (fatal-error handler) возникающее исключение приводит к остановке системы, предоставляя непривилегированному потоку пользовательского режима возможность организации отказа в обслуживании (DoS) на уровне всей системы. Исправление добавляет ту же проверку указателя, которая уже выполнялась для ветки `I2S_DIR_BOTH`, и возвращает `-ENOSYS` для направления, которое данный экземпляр не реализует; другие точки входа драйвера (`i2s_esp32_config_check()`, `i2s_esp32_config_get()`, `i2s_esp32_read()`, `i2s_esp32_write()`) уже защищали указатели, и статический аудит не выявил аналогичных незащищенных путей.
Дефект драйвера старше указанного диапазона затронутых версий. Незащищенное разыменование присутствует начиная с v4.2.0 (достигается через `i2s_esp32_trigger_stream()`, где проверка `if (stream)` тестирует адрес члена структуры и никогда не возвращает false) и принимает свою текущую форму в функции `i2s_esp32_trigger_check()` в версии v4.3.0. Ни одна конфигурация Espressif внутри дерева исходных кодов до v4.4.0 не может запустить поток пользовательского режима, поэтому в версиях v4.2.x и v4.3.x аргумент направления может поступать только из доверенного кода ядра. Эти релизы содержат уязвимость, но не указаны как затронутые; исправление также было объединено с веткой v4.3-branch в качестве меры усиления защиты (hardening).
If you want to get best quality of vulnerability data, you may have to visit VulDB.