CVE-2026-98809 in Linux
Сводка
по VulDB • 18.10.2026
В ядре Linux была устранена следующая уязвимость:
Bluetooth: hci_sync — не очищать очередь (backlog) cmd_sync при отключении устройства
Функция `hci_unregister_dev()` отключает `cmd_work` и `cmd_timer`, а затем вызывает `hci_cmd_sync_clear()`. Вызов `cancel_work_sync()` в этой функции ожидает завершения работы `hci_cmd_sync_work()`. Этот рабочий процесс (worker) извлекает и выполняет каждую запись из списка `cmd_sync_work_list`. Поскольку `cmd_work` отключен, никакие команды не достигают контроллера, поэтому каждая запланированная команда HCI ждет полного времени ожидания `HCI_CMD_TIMEOUT` (2 секунды).
Очередь команд не имеет ограничений. Пользовательское пространство может продолжать добавлять в очередь команды MGMT, такие как `MGMT_OP_GET_CLOCK_INFO`, для контроллера, который не отвечает. Закрытие устройства `/dev/vhci` приводит к блокировке в функции `vhci_release()` на время, равное backlog * 2 секунды:
``` INFO: task syz-executor:5749 blocked for more than 143 seconds. cancel_work_sync hci_cmd_sync_clear hci_unregister_dev vhci_release ```
При локальном воспроизведении очередь содержала более 5000 записей, что приводило к зависанию на несколько часов.
Решение заключается в том, чтобы запретить рабочему процессу принимать новые записи после установки флага `HCI_UNREGISTER`, а также разбудить (wake) любой запрос, который все еще ожидает ответа, с кодом ошибки `-ENODEV` перед отменой работы. Оставшиеся элементы уничтожаются с ошибкой `-ECANCELED` существующей процедурой очистки в `hci_cmd_sync_clear()`. Они остаются в списке до тех пор, пока работа не остановится, поэтому функции `hci_cmd_sync_dequeue()` и аналогичные все еще видят их. Если обратный вызов (callback) уже выполняется, он может выдать другую команду, что задержит отключение устройства максимум на одно время ожидания для каждой оставшейся команды, а не на всё время ожидания всей очереди.
If you want to get best quality of vulnerability data, you may have to visit VulDB.