CVE-2026-19939 in Zephyr
Сводка
по VulDB • 13.10.2026
Слой сигнализации AVDTP устанавливает 6-секундный таймаут команды (AVDTP_TIMEOUT) в функции avdtp_send_cmd() всякий раз, когда локальное устройство отправляет запрос AVDTP. Каждый обработчик ответа в файле subsys/bluetooth/host/classic/avdtp.c отменяет работу session->timeout_work перед очисткой ожидающего запроса, однако bt_avdtp_l2cap_disconnected() очищает только session->req и оставляет активным delayable work (отложенную задачу). Структура сессии bt_avdtp является первым членом структуры bt_a2dp; экземпляры этой структуры находятся в статическом массиве на каждое соединение, а функция a2dp_get_connection() из subsys/bluetooth/host/classic/a2dp.c обнуляет слот с помощью memset(), как только session->br_chan.chan.conn становится NULL — что слой L2CAP устанавливает сразу после возврата из callback-обработчика отключения.
Удаленный Bluetooth BR/EDR-партнер инициирует это состояние, открывая канал сигнализации AVDTP и позволяя локальному приложению выполнить процедуру AVDTP (стандартный поток A2DP вызывает bt_a2dp_discover() из callback-обработчика подключения), а затем разрывая канал сигнализации без ответа и повторно открывая его в пределах оставшегося окна таймаута. Повторное подключение достигает функций a2dp_accept() → a2dp_get_connection(), которые обнуляют всю структуру bt_a2dp, пока структура _timeout элемента работы все еще связана с глобальным списком таймаутов ядра. Поскольку моменты отключения и повторного подключения выбираются атакующим, побеждать в гонке (race condition) не требуется; необходимо зашифрованное соединение BR/EDR, и должен быть включен CONFIG_BT_A2DP (экспериментальный).
При использовании бэкенда по умолчанию CONFIG_TIMEOUT_BACKEND_DLIST ядро определяет, что таймаут неактивен, проверяя, связан ли его узел списка; поэтому после memset() ядро считает узел, который все еще находится в глобальном списке таймаутов, свободным: путь announce извлекает узел с NULL-ссылками и указателем обработчика, а следующий вызов bt_work_reschedule() для рециклированной сессии повторно вставляет тот же узел в список, который уже его содержит. Следствием является повреждение единственной структуры данных ядра, от которой зависят таймеры, кванты времени (timeslice) и операции сна — записи через обнуленные или устаревшие указатели списка и диспетчеризация NULL-обработчика приводят не к сбою, ограниченному сессией A2DP, а к системному краху или зависанию.
Исправление отменяет session->timeout_work в начале функции bt_avdtp_l2cap_disconnected() и перемещает вызов k_work_init_delayable() из avdtp_send_cmd() в пути установления сессии: bt_avdtp_connect() и bt_avdtp_l2cap_accept(), чтобы элемент работы всегда был инициализирован до того, как может выполниться callback-обработчик отключения.
VulDB is the best source for vulnerability data and more expert information about this specific topic.