Skip to main content

Zephyr RTOS CVE-2026-11893

| EUVDEUVD-2026-55935 MEDIUM
Double Free (CWE-415)
2026-08-11 vulnerabilities@zephyrproject.org
5.9
CVSS 3.1 · Vendor: zephyrproject
Share

Severity by source

Vendor (zephyrproject) PRIMARY
5.9 MEDIUM
AV:A/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:H
vuln.today AI
5.9 MEDIUM

Adjacent vector (Bluetooth range); high complexity because TX failure is only indirectly inducible; no auth required but no direct packet-level trigger; availability high, integrity low, confidentiality none.

3.1 AV:A/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:H
4.0 AV:A/AC:H/AT:P/PR:N/UI:N/VC:N/VI:L/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (zephyrproject).

CVSS VectorVendor: zephyrproject

Attack Vector
Adjacent
Attack Complexity
High
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
Low
Availability
High

Lifecycle Timeline

3
Patch available
Aug 11, 2026 - 06:01 EUVD
Source Code Evidence Fetched
Aug 11, 2026 - 05:31 vuln.today
Analysis Generated
Aug 11, 2026 - 05:31 vuln.today

DescriptionCVE.org

The Bluetooth HCI driver for Bouffalo Lab on-chip BLE controllers (BL60x/BL70x/BL61x), bt_bflb_send() in drivers/bluetooth/hci/hci_bflb.c, violates the bt_hci_driver_api.send() buffer-ownership contract. That contract (documented at include/zephyr/drivers/bluetooth.h) requires the buffer reference to be consumed only on success; on error the caller still owns the reference and unrefs it. The driver instead routed all error paths through a shared label that unconditionally called net_buf_unref(buf) before returning the error code, consuming the buffer on failure as well.

When send() returns an error, the host TX path (send_buf() in subsys/bluetooth/host/conn.c) unrefs the same buffer again, believing it still owns it. This double-unref over-decrements the net_buf reference count. Because the buffer is a TX fragment whose destroy callback also decrements its still-queued parent buffer, the parent is freed prematurely while reachable on the connection TX queue, producing a use-after-free and corruption of the shared net_buf pool rather than a benign leak.

The error conditions are on the host-to-controller transmit path (controller send failure, or an unsupported H:4 packet type), so they are not driven directly by attacker-supplied radio bytes; a remote/adjacent peer can influence them only indirectly, e.g. by inducing controller TX failures under heavy link load. The consequence when reached is BLE-stack denial of service (crash / pool corruption) with possible further memory corruption, bounded to devices using one of these Bouffalo Lab on-chip controllers.

AnalysisAI

Double-free corruption in Zephyr RTOS's Bouffalo Lab BLE HCI driver crashes the BLE stack on any device using a BL60x/BL70x/BL61x on-chip controller. The driver's bt_bflb_send() unconditionally consumed a net_buf reference on all error paths via a shared 'done' label, violating the bt_hci_driver_api contract that reserves unref responsibility for the caller on failure; the subsequent caller-side unref then double-decrements the reference count, prematurely freeing a parent TX buffer that remains reachable on the connection queue and corrupting the shared net_buf pool. No public exploit identified at time of analysis; EPSS data was not supplied, and CISA KEV listing is absent.

Technical ContextAI

The vulnerability resides in drivers/bluetooth/hci/hci_bflb.c, the Zephyr RTOS host-to-controller transport driver for Bouffalo Lab's BL60x, BL70x, and BL61x families of RISC-V-based SoCs with integrated BLE radios. Zephyr's net_buf subsystem implements reference-counted packet buffers; the bt_hci_driver_api.send() contract (documented in include/zephyr/drivers/bluetooth.h) mandates that the callee may only consume the buffer reference on success - on error, the caller (send_buf() in subsys/bluetooth/host/conn.c) retains ownership and unrefs it. The driver violated this by routing all error returns through a shared 'done' label that called net_buf_unref(buf) unconditionally, consuming the reference even on failure. The subsequent caller-side unref is the second free captured by CWE-415 (Double Free). Because the buffer is a TX fragment whose destroy callback decrements its still-queued parent buffer's reference count, the parent buffer is freed prematurely while still reachable on the connection TX queue, escalating the double-free into a use-after-free and pool-level heap corruption. The fix (commit 76d92d502b) replaces all error 'goto done' paths with direct 'return' statements, bypassing the unconditional unref.

RemediationAI

The upstream fix is available as commit 76d92d502b30218aaf11cbbe1be180a317627bb9 in the Zephyr project repository (https://github.com/zephyrproject-rtos/zephyr/commit/76d92d502b30218aaf11cbbe1be180a317627bb9); a tagged patched release version has not been independently confirmed from the available data, so consumers should verify whether their Zephyr release branch has incorporated this commit or apply the patch manually to hci_bflb.c. The change is surgical - three error return sites in bt_bflb_send() are converted from 'goto done' to direct 'return' statements, eliminating the unconditional net_buf_unref on error paths with no behavioral side effects on the success path. If patching is not immediately feasible, a compensating control is to disable BLE on affected Bouffalo Lab hardware at the application configuration level (CONFIG_BT=n or equivalent Kconfig exclusion), which prevents the vulnerable code path from being compiled or reached; the trade-off is loss of all BLE functionality. The full advisory is at https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-ph42-6rqx-728c.

Share

CVE-2026-11893 vulnerability details – vuln.today

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy