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.

Ответственный

Zephyr

Резервировать

15.08.2026

Раскрытие

13.10.2026

Модерация

принято

Вход

VDB-417816

EPSS

0.00179

KEV

Нет

Деятельности

Очень низкий

Источники

Do you know our Splunk app?

Download it now for free!