CVE-2026-97977: Bluetooth: btusb: Fix UAF of btusb_data by rx_work

Published Sep 25, 2026
·
Updated

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

Bluetooth: btusb: Fix UAF of btusbdata by rxwork

btusbclose() and btusbflush() cancel data->rxwork with the asynchronous canceldelayedwork(), so if btusbrxwork() is already running on another CPU it keeps running after the cancel returns.

btusbdisconnect() calls hciunregisterdev(), which invokes btusbclose(), and then frees the btusbdata. A still running btusbrxwork() then dereferences the freed data:

while ((skb = skbdequeue(&data->aclq))) data->recvacl(data->hdev, skb);

Use canceldelayedworksync() instead. In btusbclose() the cancel also has to happen after btusbstoptraffic(), otherwise an URB completion racing with the cancel can requeue the work right after it has been waited for.

Affected Software

1 affected component
Linux Linux kernel btusb driver

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Compensating control

    Replace the asynchronous cancel_delayed_work() calls for data->rx_work in btusb_close() and btusb_flush() with cancel_delayed_work_sync() so btusb_rx_work() has finished before btusb_data is freed.

Event History

Sep 25, 2026
CVE Published
via MITRE·10:23 AM
Data Sourced
via MITRE·10:23 AM
Description
Data Sourced
via NVD·11:17 AM
Description

Frequently Asked Questions

1

What systems are exposed to this issue?

Systems using the Linux kernel Bluetooth USB driver (btusb) are exposed when the driver is handling Bluetooth traffic and the device is closed, flushed, or disconnected while its receive work may be running.

2

What conditions are required to trigger the use-after-free?

The receive worker, btusb_rx_work(), must already be running on another CPU when btusb_close() or btusb_flush() attempts to cancel it, followed by device disconnect and freeing of btusb_data. A racing URB completion can also requeue the work if traffic is not stopped before synchronized cancellation.

3

Is stopping traffic part of the required fix?

Yes. Synchronized cancellation with cancel_delayed_work_sync() must occur after btusb_stop_traffic() in btusb_close(); otherwise an URB completion can requeue the receive work after cancellation has been waited for.

4

How can I determine whether the issue is fixed?

Check whether the btusb driver uses cancel_delayed_work_sync() for data->rx_work in btusb_close() and btusb_flush(), and verify that btusb_close() calls btusb_stop_traffic() before synchronously cancelling the receive work.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203