Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessWithin Bluetooth radio range of HFP-AG device
-
DeliverySend AT+CIND? to arm 10s ongoing-call timer
-
ExploitDisconnect then immediately re-open RFCOMM DLC on same ACL slot
-
ExecutionZeroed k_work re-init corrupts kernel timeout list
-
ImpactSystem fault or hang (denial of service)
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Memory lifecycle management
MITRE ATT&CK
2 techniques across 2 tactics: Execution, Privilege Escalation The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires the device to be built with CONFIG_BT_HFP_AG enabled (a profile the Zephyr project marks experimental and ships DISABLED by default) AND the application must implement the asynchronous get_ongoing_call callback, which is what schedules the vulnerable ag->ongoing_call_work timer (default CONFIG_BT_HFP_AG_GET_ONGOING_CALL_TIMEOUT 10000 ms). The attacker must be within Bluetooth radio range (AV:A) acting as a Hands-Free unit, and must send AT+CIND? during SLC establishment, then tear down and re-open the HFP RFCOMM DLC on the same ACL link within the ~10-second window before the application answers via bt_hfp_ag_ongoing_calls(); the same connection-index pool slot is reused deterministically, so no race-winning luck is needed. Limiting factors: experimental non-default profile, dependency on the optional callback being implemented, and physical Bluetooth proximity - these sharply reduce the exposed population below what the 6.5 score alone implies. |
| Impact | This is a genuine but conditional denial-of-service, not a top-tier priority. The CVSS 3.1 vector (AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H, base 6.5) correctly reflects an adjacent-network (Bluetooth radio range) attack with low complexity, no privileges, and no user interaction, where the only impact is availability (A:H) - consistent with the description's conclusion that no attacker-controlled data is written and code execution is not achievable. There is no CISA KEV listing and no public exploit identified at time of analysis, so exploitation status is theoretical despite a working vendor-confirmed root-cause analysis and patch. The dominant risk-limiting signal overrides the CVSS score: the vulnerable code path exists only in builds with CONFIG_BT_HFP_AG, which the project marks experimental and ships disabled by default, AND only when the application implements the asynchronous get_ongoing_call callback. The 'RCE' tag in the input directly contradicts the description and should be disregarded - this is a CWE-416 use-after-free that manifests as kernel timeout-list corruption (NULL-pointer writes / list cycle walked with interrupts locked), yielding a hang/fault, not memory corruption an attacker can steer. Net: a real, radio-reachable DoS for the narrow set of devices that both enable an experimental profile and wire up the optional callback, but low real-world exposure for the Zephyr population at large. |
| Exploit ScenarioDerived | An attacker within Bluetooth radio range of a Zephyr device acting as a Hands-Free Profile Audio Gateway sends AT+CIND? during Service Level Connection setup, causing the AG to arm a 10-second get_ongoing_call timer, then disconnects the HFP RFCOMM DLC and immediately re-opens it on the same ACL link before the timer fires. The re-creation path zeroes and re-initialises a k_work_delayable whose timeout node is still linked in the kernel list, corrupting it and faulting or hanging the entire system. No public exploit code is identified at time of analysis, but the vendor advisory describes a deterministic, remotely-driven trigger sequence. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 13, 2026
A use-after-free in Zephyr RTOS's Bluetooth Classic Hands-Free Profile Audio Gateway (HFP AG) lets an adjacent Bluetooth peer crash or hang the entire device, producing a denial of service. The flaw is reachable only in builds where CONFIG_BT_HFP_AG is enabled (a profile Zephyr marks experimental and ships disabled by default) and where the application implements the optional asynchronous get_ongoing_call callback; a Hands-Free unit sends AT+CIND? during Service Level Connection setup, then tears down and re-opens the HFP RFCOMM DLC on the same ACL link within the ~10-second timeout window, deterministically reusing the same static pool slot while ag->ongoing_call_work is still armed and linked into the kernel timeout list. The repeated memset and k_work_init_delayable corrupt the kernel timeout dlist under an interrupts-locked announce loop, causing a fault or system hang; no attacker-controlled data is written, so code execution is not demonstrated. No public exploit code or in-the-wild exploitation was identified at time of analysis, and the exposed population is sharply limited by the non-default experimental configuration and physical Bluetooth proximity.
RemediationAI
Upstream fix available (PR/commit); released patched version not independently confirmed - apply commit 204c36b896fe8d68ca3cb3d00216f245f91d14be in subsys/bluetooth/host/classic/hfp_ag.c (referenced at https://github.com/zephyrproject-rtos/zephyr/commit/204c36b896fe8d68ca3cb3d00216f245f91d14be and described in https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-v47w-8959-rx62), which adds k_work_cancel_delayable(&ag->ongoing_call_work) and k_work_cancel(&ag->slc_work) to hfp_ag_disconnected() so no still-linked timeout node survives into the next hfp_ag_create() on the same pool slot. Until that commit is in your tree, disable CONFIG_BT_HFP_AG entirely - the profile is experimental and off by default, so this restores the non-exposed configuration at the cost of removing HFP Audio Gateway capability. If HFP AG must stay enabled, do not implement the asynchronous get_ongoing_call callback, which is what arms ag->ongoing_call_work and is the sole precondition the attacker needs; the trade-off is loss of asynchronous ongoing-call reporting to the application, and this is a configuration-level mitigation rather than a code fix. Reducing the CONFIG_BT_HFP_AG_GET_ONGOING_CALL_TIMEOUT window narrows, but does not eliminate, the reconnect window and is not a substitute for patching.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Zephyr's HFP Audio Gateway keeps its struct bt_hfp_ag instances in a static pool indexed by ACL connection index. On link teardown hfp_ag_disconnected() cancels ag->tx_work and the per-call work items and clears ag->acl_conn, which is the pool slot's only occupancy indicator, but it does not cancel ag->ongoing_call_work or ag->slc_work. When the next connection lands on the same slot, hfp_ag_create() tests only ag->acl_conn, then runs memset(ag, 0, sizeof(struct bt_hfp_ag)) and k_work_init_delayable() over a k_work_delayable whose struct _timeout node is still linked into the kernel timeout list - leaving the kernel with a reference to a node whose prev/next pointers have just been zeroed. Because hfp_ag_accept() calls hfp_ag_create() directly from the RFCOMM server accept path, the remote peer drives both teardown and re-creation, and the same connection index is reused deterministically so no race-winning is required. The work item is armed purely at the peer's request: AT+CIND? during SLC establishment with the application's asynchronous get_ongoing_call callback implemented schedules the work for CONFIG_BT_HFP_AG_GET_ONGOING_CALL_TIMEOUT milliseconds (default 10000), and the timer is cancelled only if the application answers in time via bt_hfp_ag_ongoing_calls(). The resulting class is CWE-416 (use after free) manifesting as corruption of the kernel's timeout dlist: sys_dlist_remove() on the zeroed node writes through NULL pointers from the clock-announce path, and rescheduling the re-initialised work re-inserts a node the list already references, creating a cycle that the announce loop walks with interrupts locked. The outcome is a fault or hang of the whole system with no attacker-controlled write, i.e. denial of service, not memory-corruption-to-code-execution.
Know when Zephyr gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:A/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Reachable from Bluetooth range (AV:A) via a deterministic slot-reuse sequence (AC:L) with no pairing/privilege or user interaction stated; impact is system hang only (A:H, C/I:N).
Primary rating from Vendor (zephyr).
CVSS VectorVendor: zephyr
DescriptionCVE.org
The Bluetooth Classic Hands-Free Profile Audio Gateway implementation in subsys/bluetooth/host/classic/hfp_ag.c keeps its struct bt_hfp_ag objects in a static pool indexed by ACL connection index. On link teardown, hfp_ag_disconnected() cancels ag->tx_work and the per-call work items and then clears ag->acl_conn, which marks the pool slot as free - but it leaves ag->ongoing_call_work (and ag->slc_work) untouched. The next connection that lands on the same slot enters hfp_ag_create(), whose only occupancy test is ag->acl_conn, and immediately executes memset(ag, 0, sizeof(struct bt_hfp_ag)) followed by k_work_init_delayable(). Zeroing and re-initialising a k_work_delayable whose struct _timeout node is still linked into the kernel timeout list leaves the kernel holding a reference to a node with NULL prev/next links.
ag->ongoing_call_work is armed by the remote peer: when a Hands-Free unit sends AT+CIND? during Service Level Connection establishment and the application provides the asynchronous get_ongoing_call callback, the AG schedules the work for CONFIG_BT_HFP_AG_GET_ONGOING_CALL_TIMEOUT milliseconds (default 10000). The timer is cancelled only if the application answers in time via bt_hfp_ag_ongoing_calls(). A peer that sends AT+CIND?, then disconnects the HFP RFCOMM DLC, then immediately re-opens it on the same ACL link, reuses the same pool slot deterministically while the timeout is still pending - the AG's RFCOMM server accept path (hfp_ag_accept()) calls hfp_ag_create() directly, so the remote side drives both teardown and re-creation.
The result is corruption of the kernel's timeout list: sys_dlist_remove() on the zeroed node performs writes through NULL pointers from the clock-announce path, and rescheduling the re-initialised work re-inserts a node the list already references, creating a cycle that the announce loop walks with interrupts locked. The observable impact is a fault or hang of the whole system, i.e. a denial of service reachable from Bluetooth radio range; no attacker-controlled data is written, so this does not by itself yield code execution. Exposure is limited to builds with CONFIG_BT_HFP_AG (marked experimental and disabled by default) whose application implements the asynchronous get_ongoing_call callback.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Use-after-free vulnerabilities occur when a program continues to access memory through a pointer after that memory has been deallocated.
Memory corruption occurs when a program writes data beyond the boundaries of allocated memory regions or accesses memory in unintended ways, violating the integrity of the process's address space.
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
Potential off-by-one buffer overflow vulnerability in the Zephyr fuse file system. Rated critical severity (CVSS 10.0),
An out-of-bounds write in the Zephyr RTOS DNS resolver (dns_unpack_name()) lets a crafted DNS response corrupt memory on
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
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
EUVD-2026-98925
NVD
CVE.org
EPSS
GitHub
Exploit-DB