CVE-2026-19940 in Zephyr
Сводка
по VulDB • 13.10.2026
Реализация профиля Bluetooth Classic Hands-Free Audio Gateway в файле subsys/bluetooth/host/classic/hfp_ag.c хранит объекты struct bt_hfp_ag в статическом пуле, индексируемом по индексу ACL-соединения. При разрыве соединения функция hfp_ag_disconnected() отменяет ag->tx_work и рабочие элементы для каждого вызова, а затем очищает ag->acl_conn, что помечает слот в пуле как свободный — однако она оставляет ag->ongoing_call_work (и ag->slc_work) без изменений. Следующее соединение, попадающее на тот же слот, входит в hfp_ag_create(), единственным тестом занятости которого является ag->acl_conn, и немедленно выполняет memset(ag, 0, sizeof(struct bt_hfp_ag)), за которым следует k_work_init_delayable(). Обнуление и повторная инициализация k_work_delayable, чья структура _timeout node всё ещё связана со списком таймеров ядра, оставляет ядро с ссылкой на узел с нулевыми указателями prev/next.
ag->ongoing_call_work активируется удалённым пиром: когда Hands-Free устройство отправляет AT+CIND? во время установления Service Level Connection и приложение предоставляет асинхронный колбэк get_ongoing_call, AG планирует выполнение работы на CONFIG_BT_HFP_AG_GET_ONGOING_CALL_TIMEOUT миллисекунд (по умолчанию 10000). Таймер отменяется только в том случае, если приложение отвечает вовремя через bt_hfp_ag_ongoing_calls(). Пир, который отправляет AT+CIND?, затем разрывает HFP RFCOMM DLC, а затем немедленно открывает его заново на том же ACL-соединении, детерминированно использует тот же слот в пуле, пока таймер всё ещё ожидает срабатывания — путь принятия сервера AG (hfp_ag_accept()) вызывает hfp_ag_create() напрямую, поэтому удалённая сторона управляет как разрывом соединения, так и повторным созданием.
В результате происходит повреждение списка таймеров ядра: sys_dlist_remove(), вызванный для обнулённого узла, выполняет записи через нулевые указатели из пути clock-announce, а перепланирование повторно инициализированной работы вставляет в список уже ссылочный узел, создавая цикл, который проходит цикл announce с заблокированными прерываниями. Наблюдаемое воздействие заключается в ошибке (fault) или зависании всей системы, то есть отказе в обслуживании (DoS), доступном из радиуса действия Bluetooth; злоумышленник не записывает управляемые им данные, поэтому само по себе это не приводит к выполнению кода. Уязвимость затрагивает только сборки с CONFIG_BT_HFP_AG (отмечены как экспериментальные и отключены по умолчанию), в которых приложение реализует асинхронный колбэк get_ongoing_call.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.