{"id":36554,"date":"2026-10-13T08:33:19","date_gmt":"2026-10-13T00:33:19","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-19938"},"modified":"2026-10-13T08:33:19","modified_gmt":"2026-10-13T00:33:19","slug":"cve-2026-19938","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-19938","title":{"rendered":"CVE-2026-19938 [MEDIUM] &#8211; The Bluetooth host&#8217;s ATT transmit path releases a buffer it does not own when signing fail"},"content":{"rendered":"<p>The Bluetooth host&#8217;s ATT transmit path releases a buffer it does not own when signing fails. chan_send() in subsys\/bluetooth\/host\/att.c documents (and every other error exit implements) the contract that on failure the caller retains ownership of the net_buf; the BT_ATT_OP_SIGNED_WRITE_CMD branch instead called net_buf_unref(buf) when bt_smp_sign() returned an error and then returned that error to the caller. The callers act on the contract: process_queue() re-queues the buffer with k_queue_prepend(), bt_att_chan_send_rsp() puts it back on chan-&gt;tx_queue, bt_att_chan_req_send() restores it into the request, and att_req_retry() unreferences it \u2014 so the already-freed buffer was re-queued, later dereferenced, and eventually freed again.<\/p>\n<p>An ATT Signed Write Command is produced when an application calls bt_gatt_write_without_response_cb() with sign set on an unencrypted connection. bt_smp_sign() fails whenever no local CSRK exists for the peer (-ENOENT), and whether one exists is negotiated with the peer: smp_distribute_keys() stores a local CSRK only when the peer&#8217;s pairing key-distribution field requests the signing key and bonding was agreed. A peer can therefore pair without accepting the CSRK, pair with No Bonding, remain unpaired, or keep the link unencrypted, and the victim&#8217;s next signed write takes the failing path. Because struct net_buf&#8217;s node field is simultaneously the linkage word for the ATT TX FIFO, for the deferred-destroy list used by the att_pool destroy callback att_tx_destroy(), and for the pool free list, the mishandled buffer corrupts these lists and can be re-issued by bt_att_create_pdu() to a new PDU while the ATT TX path still holds it.<\/p>\n<p>The same branch also saved the net_buf_simple_state only after signing, so a buffer restored after a bt_l2cap_send_pdu() failure kept its 12-octet signature; a subsequent retry re-signed it and appended a second signature with net_buf_add(buf, 12) to a buffer that bt_att_create_pdu() sized for exactly one, writing past the end of the pooled buffer in builds where the net_buf tailroom assertion is compiled out.<\/p>\n<p>Impact is host-side memory corruption in the Bluetooth stack: list corruption, a pooled ATT buffer with two owners (wrong PDU contents transmitted, or a double free when the queues are drained at disconnect), and a bounded out-of-bounds write on the retry path \u2014 typically observed as a crash or assertion failure. Exposure requires the deprecated CONFIG_BT_SIGNING to be enabled and an application that actually issues signed writes; in that configuration the triggering condition is under the remote peer&#8217;s control.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The Bluetooth host&#8217;s ATT transmit path releases a buffer it does not own when signing fails. chan_send() in subsys\/bluetooth\/host\/att.c documents (and every other error exit implements) the contract t<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-36554","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/36554","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=36554"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=36554"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=36554"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}