Bluetooth Mesh: переполнение стекового буфера в Zephyr через увеличенный advertisement (CVE-2026-15894)
ЗАГОЛОВОК
Bluetooth Mesh: переполнение стекового буфера в Zephyr через увеличенный advertisement (CVE-2026-15894)
===PREVIEW===
В Bluetooth Mesh-стеке Zephyr обнаружена уязвимость переполнения стекового буфера (CVE-2026-15894, CVSS 8.8), возникающая
Подробности
Уязвимость CVE-2026-15894 имеет оценку CVSS 8.8 (HIGH) и затрагивает продукт zephyrproject zephyr. Обработчик solicitation в файле subsys/bluetooth/mesh/solicitation.c копирует принятый Solicitation PDU в фиксированный 17-байтовый стековый буфер без проверки длины источника. В функции sol_pdu_decrypt() буфер out создаётся как NET_BUF_SIMPLE(17), после чего заполняется вызовом net_buf_simple_add_mem(out, in->data, in->len). Функция net_buf_simple_add() контролирует свободное место только через __ASSERT_NO_MSG, который в production-сборках компилируется в ничто. В результате при in->len > 17 базовый memcpy записывает контролируемые атакующим байты за пределами 17-байтового стекового буфера. Копирование происходит до расшифровки и аутентификации, поэтому ключевой материал для срабатывания не требуется. Причина появления увеличенной длины — в том, что mesh scan callback в subsys/bluetooth/mesh/adv.c вызывает net_buf_simple_restore() перед передачей в bt_mesh_sol_recv(), из-за чего buf->len охватывает весь оставшийся рекламный payload, а не только Solicitation Service Data. После того как парсер находит Service Data AD и потребляет байт Identification Type, оставшаяся длина buf->len равна 17 октетам Network PDU плюс любые хвостовые рекламные байты. До исправления максимальная длина не проверялась (проверялся только минимум), поэтому атакующий может добавить дополнительные AD-структуры или padding после Solicitation Service Data, чтобы buf->len превысил 17. Функция bt_mesh_scan_cb() зарегистрирована напрямую как BLE scan callback, поэтому buf представляет собой сырые, неаутентифицированные рекламные данные, принятые по радиоэфиру. Любое устройство в радиусе действия может отправить non-connectable advertisement с подготовленным mesh Proxy Solicitation узлу, у которого включён CONFIG_BT_MESH_OD_PRIV_PROXY_SRV и который в данный момент может быть solicited (GATT proxy отключён, On-Demand Private Proxy включён) — без pairing, bonding и провижининга. Результат — контролируемая атакующим перезапись стека, что может привести к удалённому выполнению кода, а как минимум — к надёжному удалённому отказу в обслуживании.Что делать
Исправление обрезает buf->len до фиксированных спецификацией 17 октетов (отбрасывая PDU, если остаётся меньше) перед расшифровкой. Рекомендуется: - обновить Zephyr до версии, содержащей исправление для CVE-2026-15894; - при невозможности немедленного обновления рассмотреть отключение On-Demand Private Proxy (CONFIG_BT_MESH_OD_PRIV_PROXY_SRV) на узлах, где эта функция не требуется; - ограничить физический радиодоступ к устройствам и учитывать, что уязвимость эксплуатируется по эфиру без аутентификации; - отслеживать официальные рекомендации проекта Zephyr и бюллетени безопасности. Итог: CVE-2026-15894 — серьёзная уязвимость Bluetooth Mesh-стека Zephyr, позволяющая удалённому атакующему без ключей и сопряжения вызвать переполнение стекового буфера через увеличенный advertisement. Единственная надёжная мера — обновление до исправленной версии; для неиспользуемых конфигураций разумной митигацией является отключение On-Demand Private Proxy.Источник: CVE Project (cvelistV5)
