CVE-2026-19740 in Zephyr
Сводка
по VulDB • 11.10.2026
Реализация процедуры Link Layer Control Procedure (LLCP) в контроллере Bluetooth LE программного обеспечения Zephyr сохраняет узел приема, который содержал принятый LL_PHY_UPDATE_IND, чтобы его можно было повторно использовать для уведомления хоста при наступлении указанного момента времени (функция llcp_rx_node_retain() в файле subsys/bluetooth/controller/ll_sw/ull_llcp.c; узел намеренно не возвращается в пул, пока помечен как NODE_RX_TYPE_RETAIN). Обработчики ошибок с недопустимыми PDU для функций llcp_lp_pu_rx() и llcp_rp_pu_rx() в файле subsys/bluetooth/controller/ll_sw/ull_llcp_phy.c завершают процедуру через llcp_lr_complete() / llcp_rr_complete(), не освобождая ранее сохраненный узел. В результате контекст процедуры — единственная оставшаяся ссылка на этот узел — освобождается, пока узел все еще удерживается вне пула приема.
Устройство-партнер в рамках установленного соединения LE может детерминированно эксплуатировать эту уязвимость без сопряжения или шифрования. В отношении периферийного устройства оно отправляет LL_PHY_REQ, получает LL_PHY_RSP, затем отправляет допустимый LL_PHY_UPDATE_IND с указанием момента времени через несколько событий подключения в будущем (что приводит к сохранению узла), и перед наступлением этого момента отправляет любой другой PDU управления LL, например LL_LENGTH_REQ; функция ull_cp_rx() маршрутизирует его в активную процедуру обновления PHY удаленного устройства, которая проходит по ветке обработки недопустимых PDU. Зеркальный сценарий применим к инициированной локально процедуре обновления PHY, за которой следует LL_REJECT_IND.
В конфигурации по умолчанию (когда CONFIG_BT_ASSERT и CONFIG_BT_CTLR_ASSERT_DEBUG имеют значение y) нарушение инварианта в функциях llcp_lr_check_done() / llcp_rr_check_done() вызывает срабатывание утверждения контроллера, что приводит к k_oops() (или k_panic()) — одна специально созданная последовательность PDU из радиуса действия выводит устройство из строя. При отключении этих проверок во время компиляции каждая попытка тихо утекает один узел приема PDU и его ссылку memq; поскольку пул приема контроллера мал (PDU_RX_CNT, управляемый параметром CONFIG_BT_CTLR_RX_BUFFERS, который по умолчанию равен 1), а стоимость каждой попытки для атакующего ограничивается только повторным подключением, несколько повторов истощают пул и делают Bluetooth неработоспособным до перезагрузки. В релизах v3.4.0 через v3.7.x утверждение никогда не достигается независимо от конфигурации, поэтому каждая попытка приводит к тихой утечке памяти.
Воздействие ограничивается доступностью: осиротевший узел не оставляет висячих указателей, которые впоследствии разыменовываются, и никогда не передается хосту, поэтому отсутствует повреждение памяти или раскрытие информации. Тот же pull request применяет аналогичное исправление к процедурам обновления соединения (Connection Update) и создания CIS, чьи ветки обработки недопустимых PDU содержали ту же ошибку.
If you want to get best quality of vulnerability data, you may have to visit VulDB.