Description
In the Linux kernel, the following vulnerability has been resolved:

Bluetooth: SCO: serialise sco_conn lifetime against sco_recv_scodata()

sco_recv_scodata() upgrades the weak hcon->sco_data back-pointer to a
strong reference under hdev->lock:

hci_dev_lock(hdev);
hcon = hci_conn_hash_lookup_handle(hdev, handle);
...
conn = sco_conn_hold_unless_zero(hcon->sco_data);
hci_dev_unlock(hdev);

but the pointer is cleared from the other side without that lock. When
the last sco_conn reference is dropped, sco_conn_free() ran

conn->hcon->sco_data = NULL;

with no hdev->lock held, so the RX path could read hcon->sco_data and
call kref_get_unless_zero() on an sco_conn that was concurrently freed:

BUG: KASAN: slab-use-after-free in sco_conn_hold_unless_zero+0xbe/0x160
Write of size 4 by task kworker/u17:0
Workqueue: hci0 hci_rx_work
Call Trace:
sco_conn_hold_unless_zero+0xbe/0x160
sco_recv_scodata+0x13f/0x490
hci_rx_work+0x3af/0x730

kref_get_unless_zero() only guards against a zero refcount, not against
the backing memory already being freed.

Give hcon->sco_data an actual reference on the sco_conn it points to, so
the object cannot be freed while the pointer is still installed, and only
clear and drop it from sco_conn_del(), which runs under hdev->lock (its
callers, sco_connect_cfm() and sco_disconn_cfm(), hold it). The reader in
sco_recv_scodata() also takes hdev->lock, so the store and the read are
now serialised: the RX path either observes NULL or a reference that is
guaranteed to stay valid until it drops its own.

sco_conn_add() no longer hands its kref_init() reference to the caller as
the connection's only reference; that initial reference is the one owned
by hcon->sco_data, and callers get their own via sco_conn_hold().

Because the sco_conn can now outlive the socket (the association keeps it
alive until the link goes down), the hci_conn can no longer be dropped
from sco_conn_free() without regressing socket close: closing a connected
SCO socket must still tear the link down. Move hci_conn ownership to the
socket instead: __sco_chan_add() takes an hci_conn reference and it is
released from sco_chan_del() and sco_sock_destruct(), exactly once. The
sco_conn no longer owns an hci_conn reference, so sco_conn_add() stops
consuming one and sco_connect() drops the hci_connect_sco() reference on
every path; sco_connect_cfm() no longer needs its hci_conn_hold() dance.
Published: 2026-10-23
Score: 7.1 High
EPSS: < 1% Very Low
KEV: No
Impact: Use‑After‑Free leading to kernel crash and potential denial of service
Action: Apply Patch
AI Analysis

Impact

A race condition in the Linux kernel Bluetooth SCO module allows the RX path to obtain a weak reference to an SCO connection that can be freed concurrently because the freeing occurs without acquiring the required device lock. This missing synchronization can result in a use‑after‑free where the kernel dereferences freed memory, triggering a kernel panic or KASAN error. The flaw stems from the hcon->sco_data back‑pointer being cleared without holding hdev->lock, while the RX path reads it under that lock.

Affected Systems

All Linux kernel builds that include Bluetooth SCO support are affected until the patch that serialises the sco_conn lifetime is incorporated. Because the affected code is part of the standard kernel Bluetooth stack, any distribution shipping an unpatched kernel with SCO functionality—common in desktops, laptops, and embedded devices—should be considered vulnerable.

Risk and Exploitability

The CVSS score of 7.1 indicates a moderate‑to‑high severity vulnerability, while the EPSS score of < 1 % suggests a very low likelihood of exploitation under normal circumstances. The vulnerability is not listed in the CISA KEV catalog. Based on the description, it is inferred that exploitation requires a timing race between the RX path and a cleanup path, which is nontrivial and likely limited to privileged or local users capable of generating Bluetooth traffic. In the absence of a publicly known exploit, the risk remains moderate: a successful exploit would cause a kernel crash and loss of availability. The correct mitigation is to apply the vendor patch or to mask the vulnerable code path until the fix is available.

Generated by OpenCVE AI on October 29, 2026 at 20:45 UTC.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Apply the Linux kernel update that includes the Bluetooth SCO lifetime serialisation patch.
  • If a kernel upgrade cannot be performed immediately, unload or disable the Bluetooth module or the SCO feature to eliminate the vulnerable code path.
  • Continuously monitor kernel logs for KASAN or panic messages, and revert to a stable, patched kernel if a crash occurs.

Generated by OpenCVE AI on October 29, 2026 at 20:45 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Thu, 29 Oct 2026 19:30:00 +0000

Type Values Removed Values Added
Weaknesses CWE-362
CWE-416

Thu, 29 Oct 2026 12:15:00 +0000


Sat, 24 Oct 2026 18:15:00 +0000

Type Values Removed Values Added
Weaknesses CWE-362
CWE-416

Sat, 24 Oct 2026 16:45:00 +0000

Type Values Removed Values Added
Weaknesses CWE-362
CWE-416

Sat, 24 Oct 2026 14:15:00 +0000

Type Values Removed Values Added
Metrics cvssV3_1

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


Fri, 23 Oct 2026 19:30:00 +0000

Type Values Removed Values Added
First Time appeared Linux linux
Vendors & Products Linux linux

Fri, 23 Oct 2026 17:15:00 +0000

Type Values Removed Values Added
Weaknesses CWE-362
CWE-416

Fri, 23 Oct 2026 12:45:00 +0000

Type Values Removed Values Added
Description In the Linux kernel, the following vulnerability has been resolved: Bluetooth: SCO: serialise sco_conn lifetime against sco_recv_scodata() sco_recv_scodata() upgrades the weak hcon->sco_data back-pointer to a strong reference under hdev->lock: hci_dev_lock(hdev); hcon = hci_conn_hash_lookup_handle(hdev, handle); ... conn = sco_conn_hold_unless_zero(hcon->sco_data); hci_dev_unlock(hdev); but the pointer is cleared from the other side without that lock. When the last sco_conn reference is dropped, sco_conn_free() ran conn->hcon->sco_data = NULL; with no hdev->lock held, so the RX path could read hcon->sco_data and call kref_get_unless_zero() on an sco_conn that was concurrently freed: BUG: KASAN: slab-use-after-free in sco_conn_hold_unless_zero+0xbe/0x160 Write of size 4 by task kworker/u17:0 Workqueue: hci0 hci_rx_work Call Trace: sco_conn_hold_unless_zero+0xbe/0x160 sco_recv_scodata+0x13f/0x490 hci_rx_work+0x3af/0x730 kref_get_unless_zero() only guards against a zero refcount, not against the backing memory already being freed. Give hcon->sco_data an actual reference on the sco_conn it points to, so the object cannot be freed while the pointer is still installed, and only clear and drop it from sco_conn_del(), which runs under hdev->lock (its callers, sco_connect_cfm() and sco_disconn_cfm(), hold it). The reader in sco_recv_scodata() also takes hdev->lock, so the store and the read are now serialised: the RX path either observes NULL or a reference that is guaranteed to stay valid until it drops its own. sco_conn_add() no longer hands its kref_init() reference to the caller as the connection's only reference; that initial reference is the one owned by hcon->sco_data, and callers get their own via sco_conn_hold(). Because the sco_conn can now outlive the socket (the association keeps it alive until the link goes down), the hci_conn can no longer be dropped from sco_conn_free() without regressing socket close: closing a connected SCO socket must still tear the link down. Move hci_conn ownership to the socket instead: __sco_chan_add() takes an hci_conn reference and it is released from sco_chan_del() and sco_sock_destruct(), exactly once. The sco_conn no longer owns an hci_conn reference, so sco_conn_add() stops consuming one and sco_connect() drops the hci_connect_sco() reference on every path; sco_connect_cfm() no longer needs its hci_conn_hold() dance.
Title Bluetooth: SCO: serialise sco_conn lifetime against sco_recv_scodata()
First Time appeared Linux
Linux linux Kernel
CPEs cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
Vendors & Products Linux
Linux linux Kernel
References

Subscriptions

Linux Linux Linux Kernel
cve-icon MITRE

Status: PUBLISHED

Assigner: Linux

Published:

Updated: 2026-10-24T14:09:59.382Z

Reserved: 2026-09-25T10:25:14.385Z

Link: CVE-2026-99011

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Received

Published: 2026-10-23T13:17:23.740

Modified: 2026-10-24T14:16:52.047

Link: CVE-2026-99011

cve-icon Redhat

Severity : Moderate

Publid Date: 2026-10-23T00:00:00Z

Links: CVE-2026-99011 - Bugzilla

cve-icon OpenCVE Enrichment

Updated: 2026-10-29T21:00:21Z

Weaknesses
  • CWE-825

    Expired Pointer Dereference