Severity by source
AV:A/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:H
Bluetooth adjacency bounds reach to radio range; attacker needs no credentials as peer GATT server; A:H reflects reliable crash from freed function-pointer dereference.
Primary rating from Vendor (zephyr).
CVSS VectorVendor: zephyr
Lifecycle Timeline
3DescriptionCVE.org
The Zephyr Bluetooth GATT client CCC-write response handler gatt_write_ccc_rsp() in subsys/bluetooth/host/gatt.c invoked the application's params->subscribe() callback after it had already called params->notify(conn, params, NULL, 0).
Per the public GATT API, a notify callback with NULL data is the documented signal that the subscription has terminated and the bt_gatt_subscribe_params struct may be freed or reused by the application; calling subscribe() on the struct afterwards is a use-after-free, including an indirect call through the freed params->subscribe function pointer.
The error branch is remotely (adjacent) reachable: a Zephyr device acting as a GATT client that calls bt_gatt_subscribe() can be driven into this ordering when a connected GATT server peer answers the CCC write with an ATT Error Response (the peer-supplied error code flows through att_error_rsp -> att_handle_rsp into gatt_write_ccc_rsp).
For applications that free or recycle subscription parameters in their notification-termination handler, this results in memory corruption, a crash (denial of service), or potentially attacker-influenced control flow. The fix reorders the handler so the subscribe() callback runs before the terminating notify(NULL) in both the error and unsubscribe paths.
AnalysisAI
Use-after-free in the Zephyr RTOS Bluetooth GATT client stack allows an adjacent Bluetooth peer acting as a GATT server to crash a Zephyr device or potentially redirect its execution by replying to a CCC-write with an ATT Error Response. The defect is a callback-ordering bug in gatt_write_ccc_rsp(): the API-documented termination signal notify(NULL) was emitted before subscribe(), so applications that free or recycle bt_gatt_subscribe_params in their termination handler dereference a dangling function pointer. No public exploit code or CISA KEV entry exists; a vendor patch commit is available but a specific tagged release version has not been confirmed.
Technical ContextAI
The vulnerability resides in subsys/bluetooth/host/gatt.c within the Zephyr RTOS Bluetooth Host stack (CPE: cpe:2.3:a:zephyrproject:zephyr:*:*:*:*:*:*:*:*). GATT (Generic Attribute Profile) runs over ATT (Attribute Protocol) on BLE and uses Client Characteristic Configuration (CCC) descriptors to establish notification/indication subscriptions. The bt_gatt_subscribe_params struct carries two application-supplied callbacks - notify() and subscribe() - and its lifetime is governed by API contract: a notify(conn, params, NULL, 0) call is the documented signal that the subscription has ended and the struct may be freed or reused. The original code in the error branch (att_error_rsp → att_handle_rsp → gatt_write_ccc_rsp) invoked notify(NULL) first, then subscribe(); any application conforming to the documented contract could free the struct inside the notify handler, causing the subsequent subscribe() call through the freed params->subscribe function pointer to constitute a CWE-416 use-after-free. The fix (commit c7292f20223637232b6f962141725611a38f6a52) reorders both the error path and the unsubscribe path so subscribe() is always called before notify(NULL).
RemediationAI
Apply the upstream fix from commit c7292f20223637232b6f962141725611a38f6a52 (https://github.com/zephyrproject-rtos/zephyr/commit/c7292f20223637232b6f962141725611a38f6a52), which reorders both the ATT error path and the unsubscribe path in gatt_write_ccc_rsp() so that params->subscribe() is always invoked before params->notify(NULL). Monitor the GitHub security advisory at https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-29xh-jm2m-4qvx for an official tagged release containing this fix, as a specific patched version number was not confirmed from available data. As a compensating control where patching is not immediately feasible, application developers should defer freeing or recycling bt_gatt_subscribe_params to a workqueue or system thread context rather than directly inside the notify termination callback; this breaks the use-after-free chain without requiring a kernel patch but adds scheduling latency to subscription teardown. Restricting which Bluetooth peers the device will connect to via allowlisting (if supported by the platform) reduces exposure by preventing arbitrary adjacent attackers from acting as GATT server peers.
Potential off-by-one buffer overflow vulnerability in the Zephyr fuse file system. Rated critical severity (CVSS 10.0),
Possible variant of CVE-2021-3434 in function le_ecred_reconf_req. Rated critical severity (CVSS 9.8), this vulnerabilit
Unchecked user input length in /subsys/net/l2/wifi/wifi_shell.c can cause buffer overflows. Rated critical severity (CVS
Potential buffer overflow vulnerability in the Zephyr CAN bus subsystem. Rated critical severity (CVSS 9.8), this vulner
Integer Underflow in 6LoWPAN IPHC Header Uncompression in Zephyr. Rated critical severity (CVSS 9.8), this vulnerability
Buffer overflow in Zephyr USB DFU DNLOAD. Rated critical severity (CVSS 9.8), this vulnerability is remotely exploitable
DOS: Incorrect 802154 Frame Validation for Omitted Source / Dest Addresses. Rated critical severity (CVSS 9.8), this vul
zephyr-rtos version 1.12.0 contains a NULL base pointer reference vulnerability in sys_ring_buf_put(), sys_ring_buf_get(
Potential buffer overflow vulnerabilities n the Zephyr Bluetooth subsystem. Rated critical severity (CVSS 9.6), this vul
Buffer overflow in Zephyr RTOS dns_unpack_name() function causing OOB writes. PoC available.
The documentation specifies that the BT_GATT_PERM_READ_LESC and BT_GATT_PERM_WRITE_LESC defines for a Bluetooth characte
Potential buffer overflows in the Bluetooth subsystem due to asserts being disabled in /subsys/bluetooth/host/hci_core.c
Same weakness CWE-416 – Use After Free
View allSame technique Use After Free
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-51554