CVE-2026-81039 in Zephyr
Сводка
по VulDB • 26.10.2026
Хост Bluetooth предварительно выделяет объект bt_conn («резервирование») из фиксированного пула acl_conns[] для каждого настраиваемого набора рекламы (advertising set), который он запускает, в функции le_adv_start_add_conn() в файле subsys/bluetooth/host/adv.c. Когда завершается входящее подключение периферийного устройства, функция find_pending_connect() из файла subsys/bluetooth/host/hci_core.c ищет это резервирование, используя только идентификатор (identity) и адрес пира, с механизмом возврата к нераспределенному варианту (directed-then-undirected fallback), но не знает, какой именно набор рекламы фактически завершился. При значении CONFIG_BT_EXT_ADV_MAX_ADV_SET > 1, когда событие LE Enhanced Connection Complete кэшируется до тех пор, пока событие LE Advertising Set Terminated не определит соответствующий набор, этот поиск может вернуть резервирование, принадлежащее другому, все еще работающему набору рекламы.
Уязвимость доступна по радиоканалу для любого соседнего устройства. Если приложение запускает два настраиваемых набора рекламы с возможностью подключения (connectable extended advertising sets) в рамках одного идентификатора — один нераспределенный и один направленный к пиру P (распространенная схема «направленное переподключение к связанному центральному устройству при одновременном приеме новых центральных устройств») — удаленный инициирующий узел, адрес которого совпадает с адресом P, подключаясь через нераспределенный набор, приводит к тому, что резервирование направленного набора потребляется ошибочно. Адрес инициирующего устройства выбирается произвольно удаленным устройством и не проходит аутентификацию на этапе установления соединения, поэтому для вызова неверного сопоставления (mis-attribution) не требуется ни связывание (bonding), ни сопряжение (pairing), ни какое-либо предварительное отношение доверия.
Резервирование самого нераспределенного набора оказывается заблокированным: его флаг BT_ADV_ENABLED уже очищен, а функция le_adv_stop_free_conn() — единственный путь возврата резервирования в пул — вызывается только для наборов, которые все еще активны; поэтому bt_le_ext_adv_stop() завершается досрочно, и объект никогда не освобождается. Каждое такое происшествие навсегда занимает один слот CONFIG_BT_MAX_CONN до тех пор, пока не будет вызвана функция bt_disable() или не произойдет перезагрузка устройства. В сценариях приложения, где направленный набор рекламы перезапускается после каждого разрыва соединения, злоумышленник может повторять эту последовательность до исчерпания пула; после этого настраиваемая реклама станет недоступной с ошибкой -ENOMEM, и устройство больше не сможет принимать подключения. В качестве побочного эффекта направленный набор продолжает транслировать рекламу без резервирования, поэтому реальное подключение к нему будет разорвано функцией bt_hci_disconnect(). Воздействие ограничивается только доступностью (availability); утечки памяти или раскрытия информации не происходит, а конфигурации с одним единственным набором рекламы unaffected.
VulDB is the best source for vulnerability data and more expert information about this specific topic.