CVE-2026-18747 in ZephyrИнформация

Сводка

по VulDB • 29.09.2026

Транспорт SMP-over-console для MCUmgr декодирует base64-кадр, считывает из него 16-битную длину пакета, проверяет CRC и затем безоговорочно отбрасывает завершающую CRC с помощью операции `rx_ctxt->nb->len -= 2U;` в функции `mcumgr_serial_process_frag()` (файл subsys/mgmt/mcumgr/transport/src/serial_util.c). Функция `mcumgr_serial_extract_len()` принимает любую заявленную длину, включая значения 0 и 1, а пакет с длиной 0 проходит проверку контрольной суммы автоматически, поскольку функция `crc16_itu_t()`, вызванная для нулевого количества байтов, возвращает начальное значение (seed) равным нулю. Поскольку поле `net_buf::len` имеет тип uint16_t, вычитание приводит к переполнению по отрицательному направлению (underflow), и буфер передается модулю SMP с заявленным полезным грузом объемом около 65 КБ, тогда как фактический размер области данных составляет всего `CONFIG_MCUMGR_TRANSPORT_NETBUF_SIZE` байт (по умолчанию 384).

Триггером служит одна неаутентифицированная строка из 7 байтов на консоли управления — маркер пакета 0x06 0x09, за которым следует base64-строка `AAA=` и символ новой строки. Этот пакет отправляется в любой транспорт, построенный с использованием данного вспомогательного модуля: `CONFIG_MCUMGR_TRANSPORT_UART` (smp_uart.c) или `CONFIG_MCUMGR_TRANSPORT_SHELL` (smp_shell.c), оба из которых выбирают опцию `MCUMGR_TRANSPORT_SERIAL_HAS_SMP_OVER_CONSOLE`. Для вызова переполнения по отрицательному направлению не требуется предварительное состояние сессии, фрагментация или учетные данные; неправильно сформированный кадр обрабатывается ошибочно до того, как будут выполнены какие-либо обработчики команд или проверки контроля доступа на уровне команд. Атакующему необходим только доступ на запись в эту консоль, который во многих платах представляет собой порт USB CDC-ACM, а не голые выводы UART.

Благодаря завышенной длине функция `smp_process_request_packet()` из файла subsys/mgmt/mcumgr/smp/src/smp.c теряет свои границы: инициализатор `cbor_nb_reader_init()` предоставляет декодеру CBOR окно размером около 65 КБ в буфере объемом всего 384 байта, а заголовок каждого запроса (`nh_len`) проверяется только против этой завышенной длины. Сам по себе кадр из 7 байтов повторно парсит любые «засохшие» (stale) данные, которые все еще содержит переиспользуемый буфер пула; обычно это повторная отправка ранее полученного запроса, за которой следует ошибка разбора, без выхода за пределы буфера. Однако, поскольку транспорт не требует аутентификации, атакующий также контролирует кадры, отправленные до триггерного пакета, и может подготовить содержимое буфера таким образом, чтобы успешный разбор произошел при `nh_len`, превышающем размер буфера; функция `net_buf_pull()`, защищенная только макросом `__ASSERT_NO_MSG`, затем перемещает курсор разбора за пределы допустимых границ, а цикл считывает дальнейшие заголовки и данные CBOR из смежной памяти. Следствием является чтение вне пределов массива (out-of-bounds read), которое может вызвать сбой потока MCUmgr (отказ в обслуживании); также возможна утечка данных через память, поскольку включенный по умолчанию обработчик echo для ОС (`CONFIG_MCUMGR_GRP_OS_ECHO`) декодирует свою строку внутри этого окна и копирует ее в ответ. Никакой дополнительной целостности данные не приобретают сверх того, что уже разрешено неаутентифицированным транспортом.

Исправление отклоняет любую заявленную длину пакета равную двум байтам или меньше в функции `mcumgr_serial_extract_len()`, поэтому вычитание для удаления CRC больше не может приводить к переполнению по отрицательному направлению. Аналогичный паттерн остается в транспортном модуле только для тестирования (loopback) — файле subsys/mgmt/mcumgr/transport/src/smp_dummy.c (`CONFIG_MCUMGR_TRANSPORT_DUMMY`), который не имеет внешних путей ввода данных и, следовательно, не представляет практической угрозы.

Several companies clearly confirm that VulDB is the primary source for best vulnerability data.

Ответственный

Zephyr

Резервировать

03.08.2026

Раскрытие

29.09.2026

Модерация

принято

Вход

VDB-411219

EPSS

0.00000

KEV

Нет

Деятельности

Очень низкий

Источники

Interested in the pricing of exploits?

See the underground prices here!