Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessConnect within Bluetooth range as HFP AG
-
DeliveryAdvertise SDP record with out-of-range RFCOMM channel
-
ExploitTrigger failed bt_rfcomm_dlc_connect and live-object wipe
-
ExecutionNULL pool/func deref or self-referential SDP list
-
ImpactBluetooth host thread fault or unrecoverable hang
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 | Only builds with CONFIG_BT_CLASSIC and CONFIG_BT_HFP_HF enabled are affected, on Zephyr 4.4.0 through 4.4.2, with the device acting as an HFP Hands-Free unit. The attacker must be within Bluetooth (Adjacent) range and act as a remote Audio Gateway. The failure branch is driven either by advertising an HFP AG SDP record whose RFCOMM channel is outside 1-30 (bt_sdp_get_proto_param() and bt_hfp_hf_connect() perform no range check, so bt_rfcomm_dlc_connect() returns -EINVAL), or by controlling connection timing so the RFCOMM session is in BT_RFCOMM_STATE_DISCONNECTING or the ACL is dropped between object creation and the RFCOMM call. A key LIMITING factor: exploitation requires application code that passes the peer-discovered RFCOMM channel into bt_hfp_hf_connect() - the only in-tree caller is the shell sample and no in-tree sample does this, so reachability depends on vulnerable product application code rather than any default Zephyr build. |
| Impact | This is a medium-severity, denial-of-service-only flaw (CVSS 5.3, CVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H) whose signals point to a real but low-urgency issue rather than an emergency. Impact is limited to availability (A:H) - a fault or unrecoverable hang in the Bluetooth host thread; the stray indirect call goes through an all-zero pointer the attacker does not control, so there is no code-execution or data-exposure path (C:N/I:N). The attack vector is Adjacent (AV:A): the attacker must be within Bluetooth range and acting as, or impersonating, a remote HFP Audio Gateway. There is no CISA KEV listing and no public exploit or PoC reference in the input, so exploitation status is 'no public exploit identified at time of analysis'. No EPSS score was provided, so probabilistic exploitation likelihood cannot be weighed; this gap should be noted rather than assumed low. The vuln.today decision label is 'this_month' (not act_now/emergency), consistent with a patch-on-normal-cadence priority. A significant mitigating factor from the vendor's own evidence: the only in-tree caller of bt_hfp_hf_connect() is a shell sample, and no in-tree sample feeds a discovered RFCOMM channel, so reachability is limited to product application code that passes the peer-supplied channel without validation. PR:N honestly reflects that no local authentication is required, but real-world exposure depends on both the niche build configuration (CONFIG_BT_CLASSIC + CONFIG_BT_HFP_HF) and the presence of vulnerable application code. |
| Exploit ScenarioDerived | A remote Bluetooth device within range advertises an HFP Audio Gateway SDP record containing an RFCOMM channel outside the valid 1-30 range; when the Zephyr Hands-Free device reads that channel and calls bt_hfp_hf_connect(), bt_rfcomm_dlc_connect() returns -EINVAL and the pre-fix failure branch memset-wipes a still-live HFP object whose SDP discovery request remains linked in the SDP client's list. Subsequent SDP processing then dereferences a now-NULL pool pointer or calls through a NULL func pointer, faulting the Bluetooth host thread, or re-linking the zeroed node produces a self-referential list that hangs the host's list walkers. No public exploit code is identified; the same outcome is also reachable without a malformed channel when the peer controls connection timing. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 26, 2026
A use-after-free in the Zephyr RTOS Bluetooth Classic host lets an adjacent, unauthenticated remote Audio Gateway crash or permanently hang the Bluetooth host thread on devices running 4.4.0 through 4.4.2 as an HFP Hands-Free unit (CONFIG_BT_CLASSIC and CONFIG_BT_HFP_HF enabled). When bt_hfp_hf_connect() starts an SDP discovery and the following bt_rfcomm_dlc_connect() fails, the old code wiped the live HFP HF object with memset(), destroying a node still linked into the SDP client's request list and a possibly-queued work item; the host later dereferences the NULL pool and function pointers or walks a self-referential list. Impact is denial of service only (CVSS 5.3, AV:A/AC:H/PR:N/UI:N/C:N/I:N/A:H, CWE-416) - the stray indirect call goes through an all-zero pointer the attacker does not control, so there is no code execution. No public exploit code was identified at time of analysis, but reachability depends on product application code that feeds a peer-discovered RFCOMM channel into bt_hfp_hf_connect(); the only in-tree caller is the shell sample, which limits exposure in default builds.
RemediationAI
Upgrade to Zephyr 4.5.0 once released (the advisory's projected fixed version; the fix is merged on main but was not yet tagged at the time of the advisory, so confirm against the actual release). If a version bump is not immediately possible, apply the upstream commit https://github.com/zephyrproject-rtos/zephyr/commit/6119da5d632594131304dec85000a75dc17743d2, which is merged on main via PR #116192 and backported to the v4.4-branch via PR #118170, or cherry-pick that backport; this keeps the HFP HF object allocated with BT_HFP_HF_FLAG_RELEASING and defers release to bt_hfp_hf_discover_cb(). Where patching is not possible, the most effective compensating control is to build without CONFIG_BT_HFP_HF, which removes the Hands-Free role entirely and with it the reachable code path, at the cost of losing HFP HF functionality on that image. Additionally, product application code that feeds a peer-supplied RFCOMM channel into bt_hfp_hf_connect() should range-check the value returned by bt_sdp_get_proto_param() against channels 1-30 before calling the API, which blocks the -EINVAL trigger but does not protect against the timing-driven branches (RFCOMM session in BT_RFCOMM_STATE_DISCONNECTING or the ACL being dropped between object creation and the RFCOMM call), so it is a partial mitigation only. Vendor advisory: https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-398x-f7rq-5jj9.
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
The flaw is a classic use-after-free (CWE-416) rooted in ownership mismatch between the Bluetooth Classic HFP Hands-Free layer and the SDP client. hfp_hf_create() allocates a per-connection struct bt_hfp_hf whose embedded sdp_param and sys_snode_t _node are handed to bt_sdp_discover(); sdp_client_discovery_start() then links that caller-owned node into session->reqs in subsys/bluetooth/host/classic/sdp.c, so the SDP client retains a raw pointer into the HF object for the lifetime of the discovery. The pre-fix failure branch for a failed bt_rfcomm_dlc_connect() did (void)memset(new_hf, 0, sizeof(*new_hf)), zeroing the still-linked list node together with the request's func, uuid and pool pointers and the hf->slc_work work item that may already be queued on the system workqueue. Synchronous teardown was not an option because bt_sdp_discover_cancel() is declared in include/zephyr/bluetooth/classic/sdp.h but has no implementation in the tree. Unchecked NULL dereferences in sdp_client_alloc_buf() (net_buf_alloc(session->param->pool, ...)) and in the SDP receive paths (session->param->func()) follow; because memset() also cleared hf->acl, the only in-use marker, the slot becomes re-allocatable while its node is still linked, so a retry or an incoming HFP connection re-appends the same node and turns session->reqs into a self-referential list that sdp_client_params_iterator() never leaves. The upstream fix introduces BT_HFP_HF_FLAG_RELEASING: the object is kept allocated and marked on the RFCOMM failure path, and bt_hfp_hf_discover_cb() releases it (clearing hf->acl and returning BT_SDP_DISCOVER_UUID_STOP) once the outstanding discovery completes, cancelling slc_work if discovery already finished.
Know when Bluetooth 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:H/PR:N/UI:N/S:U/C:N/I:N/A:H
Adjacent Bluetooth range (AV:A), no authentication (PR:N); AC:H reflects the timing-race path and the dependency on vulnerable app code; availability-only impact (A:H, C/I:N).
Primary rating from Vendor (zephyr).
CVSS VectorVendor: zephyr
DescriptionCVE.org
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.
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.
Unauthenticated Bluetooth Low Energy OTA firmware upgrade in the Meatmeet Pro WiFi & Bluetooth Meat Thermometer firmware
CVE-2025-32879 is a security vulnerability (CVSS 8.8) that allows an attacker. Risk factors: public PoC available.
Zephyr's Bluetooth Low Energy connection-response handler fails to verify that a connection request was actually initiat
Heap OOB write in Android Bluetooth driver via incorrect bounds check.
A use-after-free in the Android Bluetooth stack (bluetooth_ccc.cc, function BluetoothCccHandlerCallbackImpl) lets an att
Legacy pairing and secure-connections pairing authentication in Bluetooth BR/EDR Core Specification v5.2 and earlier may
Memory corruption in the Zephyr RTOS LE Audio Broadcast Sink (subsys/bluetooth/audio/bap_broadcast_sink.c) lets an attac
A memory leak combined with a use-after-free in the Linux kernel's Bluetooth HCI connection-setup path can crash the ker
A race condition in the Linux kernel's Bluetooth L2CAP subsystem allows a use-after-free of the hci_conn::l2cap_data poi
Bluetooth authentication bypass in SwitchBot Door Lock Series allows an attacker within BLE range to manipulate the lock
Out-of-bounds read in the Linux kernel Bluetooth subsystem's eir_get_service_data() leaks kernel heap memory into usersp
Use-after-free in the Linux kernel Bluetooth L2CAP stack lets a Bluetooth-adjacent attacker corrupt kernel memory by rac
EUVD-2026-109974
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB