Description
The AVDTP signalling layer arms a 6-second command timeout (AVDTP_TIMEOUT) in avdtp_send_cmd() whenever the local device issues an AVDTP request. Every response handler in subsys/bluetooth/host/classic/avdtp.c cancels session->timeout_work before clearing the pending request, but bt_avdtp_l2cap_disconnected() only cleared session->req and left the delayable work armed. The struct bt_avdtp session is the first member of struct bt_a2dp, whose instances live in a static per-connection array, and a2dp_get_connection() in subsys/bluetooth/host/classic/a2dp.c wipes a slot with memset() as soon as session->br_chan.chan.conn is NULL — which the L2CAP layer arranges immediately after the disconnect callback returns.

A remote Bluetooth BR/EDR peer triggers the condition by opening the AVDTP signalling channel, letting the local application issue an AVDTP procedure (the standard A2DP flow issues bt_a2dp_discover() from the connected callback), then tearing the signalling channel down without responding and re-opening it within the remaining timeout window. The reconnect reaches a2dp_accept() → a2dp_get_connection(), which zeroes the whole struct bt_a2dp while the work item's struct _timeout is still linked into the kernel's global timeout list. Both the disconnect and the reconnect instants are chosen by the attacker, so no race has to be won; an encrypted BR/EDR link is required, and CONFIG_BT_A2DP (experimental) must be enabled.

With the default CONFIG_TIMEOUT_BACKEND_DLIST backend the kernel decides a timeout is inactive by testing whether its list node is linked, so after the memset() the kernel treats a node that is still on the global timeout list as free: the announce path pops a node whose links and handler pointer are NULL, and the next bt_work_reschedule() on the recycled session re-inserts the same node into a list that already contains it. The consequence is corruption of the single kernel data structure every timer, timeslice and sleep depends on — writes through zeroed or stale list pointers and a NULL handler dispatch — producing a system-wide crash or hang rather than a fault confined to the A2DP session.

The fix cancels session->timeout_work at the top of bt_avdtp_l2cap_disconnected() and moves k_work_init_delayable() from avdtp_send_cmd() to the session-establishment paths bt_avdtp_connect() and bt_avdtp_l2cap_accept(), so the work item is always initialized before a disconnect callback can run.
Published: 2026-10-13
Score: 6.3 Medium
EPSS: n/a
KEV: No
Impact: Kernel Crash
Action: Patch Immediately
AI Analysis

Impact

The AVDTP signalling layer in Zephyr RTOS schedules a 6‑second command timeout whenever a local device sends an AVDTP request. The code clears the timeout work item when handling the corresponding response, but during a disconnect the work item remains armed. If a remote Bluetooth BR/EDR peer closes the signalling channel and then re‑opens it before the timeout elapses, the session data structure is zeroed by the acceptance routine while the delayed work is still linked in the kernel’s global timeout list. The kernel interprets this stale list node as a free entry, leading to corruption of the timeout list that is used by every timer, timeslice, and sleep. The corruption manifests as a system‑wide crash or hang, not merely a fault confined to the A2DP session.

Affected Systems

Devices running the Zephyr RTOS with Bluetooth Classic support and the experimental A2DP profile enabled are vulnerable. The issue is triggered only when CONFIG_BT_A2DP is set and an encrypted BR/EDR link is available. The vulnerability is present in Zephyr revisions that include the affected avdtp.c and a2dp.c code paths; the fix is included in the commit referenced in the CVE advisory.

Risk and Exploitability

The CVSS score of 6.3 indicates a moderate severity, but the exploit can be performed remotely over a Bluetooth link that the attacker can establish. The lack of an EPSS score and absence from the CISA KEV catalog suggest that exploitation is not widely observed yet. Nevertheless, because the bug leads to a kernel timeout‑list corruption, any successful exploitation results in denial‑of‑service through a system crash or hang. The attack does not require elevated privileges on the device, so it is sufficient that the attacker can pair or communicate with the target over Bluetooth Classic.

Generated by OpenCVE AI on October 13, 2026 at 19:19 UTC.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Update Zephyr to a revision that incorporates the avdtp timeout corruption fix (the commit referenced in the advisory).
  • If the device cannot be updated, disable the CONFIG_BT_A2DP option or block incoming Bluetooth Classic connections to prevent the AVDTP signalling from being established.
  • Enable kernel logging and monitoring for panic or hang events to detect any remaining instability during testing.

Generated by OpenCVE AI on October 13, 2026 at 19:19 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Tue, 13 Oct 2026 19:45:00 +0000

Type Values Removed Values Added
First Time appeared Zephyrproject
Zephyrproject zephyr
Vendors & Products Zephyrproject
Zephyrproject zephyr

Tue, 13 Oct 2026 17:00:00 +0000

Type Values Removed Values Added
Description The AVDTP signalling layer arms a 6-second command timeout (AVDTP_TIMEOUT) in avdtp_send_cmd() whenever the local device issues an AVDTP request. Every response handler in subsys/bluetooth/host/classic/avdtp.c cancels session->timeout_work before clearing the pending request, but bt_avdtp_l2cap_disconnected() only cleared session->req and left the delayable work armed. The struct bt_avdtp session is the first member of struct bt_a2dp, whose instances live in a static per-connection array, and a2dp_get_connection() in subsys/bluetooth/host/classic/a2dp.c wipes a slot with memset() as soon as session->br_chan.chan.conn is NULL — which the L2CAP layer arranges immediately after the disconnect callback returns. A remote Bluetooth BR/EDR peer triggers the condition by opening the AVDTP signalling channel, letting the local application issue an AVDTP procedure (the standard A2DP flow issues bt_a2dp_discover() from the connected callback), then tearing the signalling channel down without responding and re-opening it within the remaining timeout window. The reconnect reaches a2dp_accept() → a2dp_get_connection(), which zeroes the whole struct bt_a2dp while the work item's struct _timeout is still linked into the kernel's global timeout list. Both the disconnect and the reconnect instants are chosen by the attacker, so no race has to be won; an encrypted BR/EDR link is required, and CONFIG_BT_A2DP (experimental) must be enabled. With the default CONFIG_TIMEOUT_BACKEND_DLIST backend the kernel decides a timeout is inactive by testing whether its list node is linked, so after the memset() the kernel treats a node that is still on the global timeout list as free: the announce path pops a node whose links and handler pointer are NULL, and the next bt_work_reschedule() on the recycled session re-inserts the same node into a list that already contains it. The consequence is corruption of the single kernel data structure every timer, timeslice and sleep depends on — writes through zeroed or stale list pointers and a NULL handler dispatch — producing a system-wide crash or hang rather than a fault confined to the A2DP session. The fix cancels session->timeout_work at the top of bt_avdtp_l2cap_disconnected() and moves k_work_init_delayable() from avdtp_send_cmd() to the session-establishment paths bt_avdtp_connect() and bt_avdtp_l2cap_accept(), so the work item is always initialized before a disconnect callback can run.
Title Bluetooth Classic AVDTP: stale timeout work on signalling-channel disconnect leads to kernel timeout-list corruption
Weaknesses CWE-825
References
Metrics cvssV3_1

{'score': 6.3, 'vector': 'CVSS:3.1/AV:A/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:H'}


Subscriptions

Zephyrproject Zephyr
cve-icon MITRE

Status: PUBLISHED

Assigner: zephyr

Published:

Updated: 2026-10-13T16:39:16.681Z

Reserved: 2026-08-15T13:31:21.855Z

Link: CVE-2026-19939

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Awaiting Analysis

Published: 2026-10-13T17:17:39.937

Modified: 2026-10-13T20:20:25.657

Link: CVE-2026-19939

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-10-13T19:30:12Z

Weaknesses
  • CWE-825

    Expired Pointer Dereference