CVE-2026-82388
MediumCVSS 5.3Exploitation Probability (EPSS)
Low risk11th percentile - higher than 11% of all known CVEs
Summary
A vulnerability in the Zephyr Bluetooth stack affects bt_hfp_hf_connect(), which wipes the entire HFP Hands-Free object when bt_rfcomm_dlc_connect() fails, even though the associated SDP discovery is still outstanding. This leads to use-after-free, including NULL pointer dereferences and a self-referential SDP request list, causing a fault or unrecoverable hang in the Bluetooth host thread. The flaw is remotely reachable, e.g., via a device advertising an RFCOMM channel outside 1-30 or controlling connection timing.
Risk Assessment
A remote attacker can cause denial of service (DoS) by hanging or crashing the Bluetooth stack on the device, potentially disrupting communication and requiring a restart. Only builds with CONFIG_BT_CLASSIC and CONFIG_BT_HFP_HF enabled are affected.
Recommendation
Update Zephyr to a version containing the fix that marks the object with BT_HFP_HF_FLAG_RELEASING instead of wiping it and releases it after discovery completes. If updating is not possible, consider disabling CONFIG_BT_HFP_HF or limiting trust in remote Bluetooth devices.
Other vulnerabilities in Zephyr Bluetooth Host
See all- CVE-2026-81039Medium
A vulnerability in the Zephyr Bluetooth host causes incorrect attribution of a bt_conn reservation to an advertising set during incoming peripheral connections. When multiple extended advertising sets are enabled (CONFIG_BT_EXT_ADV_MAX_ADV_SET > 1), find_pending_connect() may return a reservation belonging to a different, still-running set, permanently leaking a connection slot. An adjacent attacker can exploit this over the air without authentication, exhausting the connection pool and causing denial of service.
- CVE-2026-19938Medium
A vulnerability in the Zephyr Bluetooth host stack causes a double-free of a net_buf in the ATT transmit path when signing fails. Additionally, on a bt_l2cap_send_pdu() failure, a buffer may be reused with a stale signature, leading to an out-of-bounds write. This results in memory corruption, crashes, or potential code execution.
- CVE-2026-12236Medium
A vulnerability in the parse_read_std_char_desc() function in the Bluetooth host subsystem (subsys/bluetooth/host/gatt.c) allows a remote, unauthenticated device to hang the Bluetooth processing thread by sending an ATT response with a zero entry length (rsp->len = 0). The parsing loop does not validate the minimum value of rsp->len, leading to an infinite loop (CWE-835) and failure to terminate descriptor discovery.
- CVE-2026-5068High
In the Bluetooth host stack, during L2CAP LE CoC SDU reassembly, a remote unauthenticated BLE peer can trigger a 2-byte out-of-bounds write. This occurs when segmentation is enabled and the chosen RX pool has user_data_size smaller than 2 bytes, causing the segmentation counter to be written out of bounds in l2cap_chan_le_recv_seg.
Original NVD description (English source)
bt_hfp_hf_connect() in subsys/bluetooth/host/classic/hfp_hf.c allocates the per-connection HFP Hands-Free object with hfp_hf_create(), which starts an SDP discovery by passing the object's embedded hf->sdp_param to bt_sdp_discover(). That call links the caller-owned parameter block into the SDP client's request list (session->reqs in subsys/bluetooth/host/classic/sdp.c). If the subsequent bt_rfcomm_dlc_connect() then failed, the affected code wiped the entire object with (void)memset(new_hf, 0, sizeof(*new_hf)) while that discovery was still outstanding, zeroing the sys_snode_t _node that is still linked in the SDP client's list along with the request's func, uuid and pool pointers, and zeroing the hf->slc_work work item that may already be queued on the system workqueue. The discovery could not be retracted instead: bt_sdp_discover_cancel() is declared in include/zephyr/bluetooth/classic/sdp.h but has no implementation. The failing branch is reachable with peer-supplied input. The documented use of bt_hfp_hf_connect() is to pass the RFCOMM channel read out of the remote Audio Gateway's SDP record; neither bt_sdp_get_proto_param() nor bt_hfp_hf_connect() range-checks that value, so a remote device advertising an HFP AG record with an RFCOMM channel outside 1-30 makes bt_rfcomm_dlc_connect() return -EINVAL and drives the local device into the wipe. The same branch is reached without any application misuse when the remote peer controls connection timing, for example when the RFCOMM session is in BT_RFCOMM_STATE_DISCONNECTING or the ACL is dropped between object creation and the RFCOMM call. Once the object has been wiped, the Bluetooth host continues to use it: sdp_client_alloc_buf() dereferences session->param->pool, which is now NULL, and the SDP receive paths call session->param->func() through a null function pointer, neither of which is NULL-checked. Because the wipe also clears hf->acl, the pool slot is considered free and a retry or an incoming HFP connection re-appends the same still-linked list node, turning session->reqs into a self-referential list that the host's list walkers never leave. The result is a fault or an unrecoverable hang in the Bluetooth host thread; the stray indirect call is through an all-zero pointer whose target the attacker does not control, so the practical impact is denial of service. The fix keeps the object allocated and marks it with a new BT_HFP_HF_FLAG_RELEASING flag, letting bt_hfp_hf_discover_cb() release it once the discovery completes instead of destroying it under the SDP client. Only builds with CONFIG_BT_CLASSIC and CONFIG_BT_HFP_HF enabled are affected.
Vulnerability data from NVD (NIST) · CISA KEV · EPSS

