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.