CVE-2026-19938 in ZephyrИнформация

Сводка

по VulDB • 13.10.2026

В пути передачи данных ATT (Attribute Protocol) хоста Bluetooth происходит освобождение буфера, которым он не владеет, при сбое операции подписи. Функция chan_send() в файле subsys/bluetooth/host/att.c документирует (и все другие выходы по ошибке реализуют) контракт о том, что в случае неудачи владелец сетевого буфера (net_buf) сохраняется за вызывающей стороной; однако ветвь BT_ATT_OP_SIGNED_WRITE_CMD вместо этого вызывает net_buf_unref(buf), когда bt_smp_sign() возвращает ошибку, а затем передает эту ошибку обратно вызывающей стороне. Вызывающие стороны действуют в соответствии с контрактом: process_queue() повторно помещает буфер в очередь с помощью k_queue_prepend(), bt_att_chan_send_rsp() возвращает его в chan->tx_queue, bt_att_chan_req_send() восстанавливает его в запросе, а att_req_retry() уменьшает счетчик ссылок (unreferences) — таким образом, уже освобожденный буфер повторно помещается в очередь, позже разыменовывается и в конечном итоге снова освобождается.

Команда ATT Signed Write Command генерируется, когда приложение вызывает bt_gatt_write_without_response_cb() со включенным флагом подписи на незашифрованном соединении. bt_smp_sign() терпит неудачу всякий раз, когда для пирингового узла (peer) не существует локального CSRK (-ENOENT), а наличие такого ключа согласовывается с партнером: smp_distribute_keys() сохраняет локальный CSRK только в том случае, если поле распределения ключей сопряжения партнера запрашивает ключ подписания и было достигнуто согласие на связывание (bonding). Таким образом, пиринговый узел может выполнить сопряжение без принятия CSRK, выполнить сопряжение с параметром No Bonding, остаться несопряженным или сохранить соединение незашифрованным, а следующая операция записи с подписью у жертвы приведет к выполнению ветви кода с ошибкой. Поскольку поле node структуры net_buf одновременно является словом связи для ATT TX FIFO, для списка отложенного уничтожения, используемого обратным вызовом разрушения пула att_tx_destroy(), и для свободного списка пула, некорректно обработанный буфер приводит к повреждению этих списков и может быть повторно выдан функцией bt_att_create_pdu() в новую PDU (Protocol Data Unit), пока путь передачи ATT все еще удерживает его.

Та же самая ветвь также сохраняла состояние net_buf_simple_state только после операции подписи, поэтому буфер, восстановленный после сбоя функции bt_l2cap_send_pdu(), сохранял свою 12-октетную подпись; последующая повторная попытка повторно подписала ее и добавила вторую подпись с помощью net_buf_add(buf, 12) к буферу, который bt_att_create_pdu() выделила ровно для одной подписи, что приводит к записи за пределами пулового буфера в сборках, где утверждение (assertion) о наличии места в хвосте net_buf отключено.

Воздействие заключается во вредоносном изменении памяти на стороне хоста в стеке Bluetooth: повреждение списков, наличие у пулового ATT-буфера двух владельцев (передача PDU с неверным содержимым или двойное освобождение при очистке очередей при разрыве соединения) и ограниченная запись за пределами границ буфера на пути повторной попытки — что обычно проявляется как аварийное завершение работы (crash) или срабатывание утверждения. Для эксплуатации требуется включение устаревшей конфигурации CONFIG_BT_SIGNING и наличие приложения, которое фактически выполняет операции записи с подписью; в такой конфигурации условие запуска находится под контролем удаленного пирингового узла.

Once again VulDB remains the best source for vulnerability data.

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

Zephyr

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

15.08.2026

Раскрытие

13.10.2026

Модерация

принято

Вход

VDB-417364

EPSS

0.00000

KEV

Нет

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

Очень низкий

Источники

Interested in the pricing of exploits?

See the underground prices here!