Skip to main content
Vulnerability Database/CVE-2026-19570

CVE-2026-19570: Bluetooth LE Audio Broadcast Sink RCE Vulnerability

CVE-2026-19570 is a remote code execution flaw in Bluetooth LE Audio Broadcast Sink that enables memory corruption through crafted broadcast data. This post explains its impact, affected versions, and mitigation steps.

Published:

CVE-2026-19570 Overview

CVE-2026-19570 is a buffer overflow vulnerability [CWE-120] in the Zephyr RTOS Bluetooth LE Audio Broadcast Sink implementation. The flaw resides in subsys/bluetooth/audio/bap_broadcast_sink.c, where subgroup metadata from a received Basic Audio Announcement (BASE) is copied into the static mod_src_param structure without bounds checks. An attacker within Bluetooth radio range can send a crafted BASE through periodic advertising to overflow a fixed static object in .bss memory. Exploitation requires no pairing, bonding, or GATT connection, and may lead to remote code execution in the Bluetooth RX thread or disclosure of adjacent memory via BASS receive-state notifications.

Critical Impact

Unauthenticated attackers in Bluetooth range can corrupt adjacent memory on broadcast sink devices, potentially achieving remote code execution without any user interaction or prior pairing.

Affected Products

  • Zephyr RTOS builds with CONFIG_BT_BAP_BROADCAST_SINK enabled
  • Devices using the LE Audio Broadcast Sink in subsys/bluetooth/audio/bap_broadcast_sink.c
  • Any Zephyr-based firmware acting as a Bluetooth Audio Scan Service (BASS) delegator

Discovery Timeline

  • 2026-10-09 - CVE-2026-19570 published to NVD
  • 2026-10-09 - Last updated in NVD database

Technical Details for CVE-2026-19570

Vulnerability Analysis

The vulnerability affects the Basic Audio Profile (BAP) Broadcast Sink role in Zephyr's Bluetooth stack. When a sink device synchronizes to a periodic advertising train, it parses the BASE structure describing the broadcast's subgroups and codec metadata. The parser base_subgroup_meta_cb() writes each subgroup entry into mod_src_param.subgroups[mod_src_param.num_subgroups] without comparing num_subgroups to ARRAY_SIZE(mod_src_param.subgroups).

The destination array is sized by CONFIG_BT_BAP_BASS_MAX_SUBGROUPS with a default of 1, and the per-subgroup metadata buffer is sized by CONFIG_BT_AUDIO_CODEC_CFG_MAX_METADATA_SIZE with a default of 4 bytes. The BASE validator bt_bap_base_get_base_from_ad() only enforces structural consistency and permits up to roughly 24 subgroups with metadata Length-Type-Value (LTV) fields of around 240 octets. Writes extend past the static object in .bss into adjacent Bluetooth audio state.

Root Cause

The root cause is missing bounds validation on two independent fields. First, num_subgroups is incremented without checking array capacity. Second, memcpy() uses the raw on-air length returned by bt_bap_base_get_subgroup_codec_meta() without comparing against the destination metadata buffer size. The unvalidated metadata_len is also forwarded to bt_bap_scan_delegator_mod_src(), which neither clamps nor rejects it.

Attack Vector

An attacker operating a rogue broadcast source within radio range can advertise a BASE the target device syncs to. Alternatively, the attacker can impersonate the advertiser address and Set ID (SID) of an existing source, because periodic advertising data is unauthenticated. Each new BASE is re-parsed through the chain pa_recv() → bt_data_parse() → pa_decode_base() → update_recv_state_base() → bt_bap_base_foreach_subgroup() → base_subgroup_meta_cb(). A crafted BASE writes attacker-chosen bytes up to approximately 236 bytes past the metadata buffer, plus full struct bt_bap_bass_subgroup records for each excess subgroup.

c
// Security patch - subsys/bluetooth/audio/bap_broadcast_sink.c
	ARG_UNUSED(user_data);

+	if (mod_src_param.num_subgroups == ARRAY_SIZE(mod_src_param.subgroups)) {
+		return false;
+	}
+
+	subgroup_param = &mod_src_param.subgroups[mod_src_param.num_subgroups];
+
 	ret = bt_bap_base_get_subgroup_codec_meta(subgroup, &meta);
 	if (ret < 0) {
 		return false;
 	}

-	subgroup_param = &mod_src_param.subgroups[mod_src_param.num_subgroups];
+	if (ret <= sizeof(subgroup_param->metadata)) {
+		subgroup_param->metadata_len = (uint8_t)ret;
+		(void)memcpy(subgroup_param->metadata, meta, subgroup_param->metadata_len);
+	} else {
+		subgroup_param->metadata_len = 0U;
+	}
+
 	mod_src_param.num_subgroups++;
-	subgroup_param->metadata_len = (uint8_t)ret;
-	memcpy(subgroup_param->metadata, meta, subgroup_param->metadata_len);
// Source: Zephyr commit 5738f61f4128bb38508bab57342b1f7bf218d127

The patch rejects BASE updates carrying more subgroups than the receive state can hold and omits metadata that does not fit. It also honors the previously ignored error return of the subgroup decode pass.

Stop Remote Code Execution Before It Runs

Singularity™ Endpoint detects and blocks exploit attempts at machine speed, including zero-days and novel attack techniques.

Stop Exploit Attempts

Detection Methods for CVE-2026-19570

Indicators of Compromise

  • Unexpected device resets, hangs, or firmware crashes on Zephyr-based Bluetooth audio devices following periodic advertising sync events
  • BASS receive-state notifications containing unusual metadata payloads sent to connected Broadcast Assistants
  • Repeated periodic advertising syncs to broadcast sources with anomalous advertiser addresses or SIDs

Detection Strategies

  • Monitor Bluetooth stack logs for parsing errors, assertion failures, or memory faults in the BAP broadcast sink path
  • Capture over-the-air Bluetooth traffic to identify BASE structures exceeding CONFIG_BT_BAP_BASS_MAX_SUBGROUPS or carrying metadata LTVs larger than CONFIG_BT_AUDIO_CODEC_CFG_MAX_METADATA_SIZE
  • Review firmware telemetry for crashes in the Bluetooth RX thread correlated with periodic advertising reception

Monitoring Recommendations

  • Deploy Bluetooth protocol analyzers near production LE Audio devices to flag malformed BASE announcements
  • Instrument Zephyr builds with stack and heap canaries to catch overflows in .bss-resident BAP structures
  • Alert on unexpected changes in advertiser identity for sources a device has synced to

How to Mitigate CVE-2026-19570

Immediate Actions Required

  • Apply the upstream Zephyr patch from commit 5738f61f4128bb38508bab57342b1f7bf218d127 to all affected firmware images
  • Rebuild and redistribute firmware for any device shipping with CONFIG_BT_BAP_BROADCAST_SINK enabled
  • Audit device fleets to identify builds exposing the LE Audio Broadcast Sink role

Patch Information

The fix is published in the Zephyr project repository. See the GitHub Commit Details and the GitHub Security Advisory GHSA-4qwc-2qfq-w2fj. The patch adds a capacity check against ARRAY_SIZE(mod_src_param.subgroups), compares the decoded metadata length against sizeof(subgroup_param->metadata) before copying, and honors the error return from the subgroup decode pass.

Workarounds

  • Disable CONFIG_BT_BAP_BROADCAST_SINK in device builds where the LE Audio Broadcast Sink role is not required
  • Restrict device operation to physically controlled Bluetooth environments until patched firmware is deployed
  • Reduce exposure by limiting periodic advertising sync to known, validated broadcast sources at the application layer
bash
# Verify Zephyr source includes the fix
cd zephyr
git log --oneline subsys/bluetooth/audio/bap_broadcast_sink.c | grep 5738f61f

# Disable Broadcast Sink role in prj.conf if not required
# CONFIG_BT_BAP_BROADCAST_SINK=n

Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

Experience the Most Advanced Cybersecurity Platform

See how the world’s most intelligent, autonomous cybersecurity platform can protect your organization today and into the future.