Lock order inversion in Linux kernel RFCOMM Bluetooth connect
Key facts
- Attack vector
- —
- Privileges required
- —
- User interaction
- —
- Attack complexity
- —
- Impact type
- —
- Confidentiality · integrity · availability
- —
- Fix status
- Partial Red Hat: 6 without a fix
No CVSS vector from any source. Fix status from CNA and Red Hat.
Summary
The Linux kernel Bluetooth RFCOMM code is affected from 5.10.270 before 5.10.273 and in other stable branches. An RFCOMM connect() made while a BR/EDR link is being authenticated takes rfcomm_mutex and hdev->lock in the reverse order of the HCI event path, which creates a lock order inversion. Connecting a device that authenticates and encrypts the link and then calling connect() on an RFCOMM socket makes lockdep report the circular dependency.
Written with Claude Haiku 5.5 from the sources below · 2026-10-30
Description from the CNA
In the Linux kernel, the following vulnerability has been resolved: Bluetooth: RFCOMM: connect the session socket without rfcomm_mutex An RFCOMM connect() issued while a BR/EDR link is being authenticated makes lockdep report a circular dependency, and the reported cycle is a real AB/BA between rfcomm_mutex and hdev->lock. rfcomm_security_cfm() is called from the HCI event path, which already holds hdev->lock: hci_rx_work() hci_event_packet() hci_cc_read_enc_key_size() [hdev->lock] hci_encrypt_cfm() [hci_cb_list_lock] rfcomm_security_cfm() [rfcomm_mutex] while an RFCOMM connect() from userspace takes the same two locks the other way round: rfcomm_sock_connect() rfcomm_dlc_open() [rfcomm_mutex] __rfcomm_dlc_open() rfcomm_session_create() kernel_connect() l2cap_sock_connect() l2cap_chan_connect() [hdev->lock] WARNING: possible circular locking dependency detected kworker/u131:1/1128 is trying to acquire lock: rfcomm_mutex, at: rfcomm_security_cfm+0x31/0x3e0 [rfcomm] but task is already holding lock: hci_cb_list_lock, at: hci_cc_read_enc_key_size+0x1d2/0xcc0 Chain exists of: rfcomm_mutex --> &hdev->lock --> hci_cb_list_lock hci_auth_complete_evt() and hci_encrypt_change_evt() reach the callback the same way. Both orders have to be seen in the same boot, which is why a BR/EDR connection alone is not enough to show it: a session set up by the remote side is created by rfcomm_accept_connection() in krfcommd, which calls kernel_accept() and never takes hdev->lock under rfcomm_mutex. Connecting a device that authenticates and encrypts the link and then calling connect() on an RFCOMM socket towards any address - the connect does not have to succeed, the order is recorded before the page timeout - reports it every time. Only the session socket has to be connected with the lock held, and it does not: nothing else can see the socket before it is put on the session list. So connect it first and take rfcomm_mutex afterwards, which removes the rfcomm_mutex -> hdev->lock order for good, rather than keeping the HCI event path out of rfcomm_mutex. rfcomm_session_create() becomes rfcomm_session_connect(), which returns the connected socket without touching the session list, and rfcomm_dlc_open() adds the session once it holds the lock again. If another opener added a session for the same pair while this socket was connecting, that session is used and this socket is dropped. __rfcomm_dlc_open() now takes the session it should use, and its state check runs after the lock is re-acquired, so a DLC that was opened or closed in the meantime is still handled. Over an existing ACL link the connection can complete before the session reaches the list, and the wakeup from the socket callback is then lost, so krfcommd is woken once the session is visible. Connecting without the lock opens a window in which the socket can be closed. The DLC is not on a session yet, so rfcomm_dlc_close() finds nothing to do and returns without touching it, and rfcomm_dlc_open() would then attach a DLC whose owner is gone. rfcomm_dlc_close() now marks such a DLC with RFCOMM_CLOSED, and rfcomm_dlc_open() checks the mark once it holds rfcomm_mutex again and drops the socket instead of attaching the DLC. The mark is cleared when an open starts, so a DLC that is reused is not affected. This covers both callers of rfcomm_dlc_open(), the socket and the tty layer.
Why it matters now
SSVC decision points
Not available: CISA has not published SSVC decision points for this record.
Affected products
| Vendor | Product | Affected versions | Fixed in | Status | Source |
|---|---|---|---|---|---|
| Linux | Linux | 5.10.270 to before 5.10.273; 5.15.221 to before 5.15.224; 6.1.188 to before 6.1.191; 6.6.157 to before 6.6.160; 6.12.109 to before 6.12.114; 6.18.50 to before 6.18.58; 7.2.4 to before 7.2.11 | 5.10.273, 5.15.224, 6.1.191, 6.6.160, 6.12.114, 6.18.58, 7.2.11 | Patch available | CNA |
- Linux VendorLinux Affected 5.10.270 to before 5.10.273; 5.15.221 to before 5.15.224; 6.1.188 to before 6.1.191; 6.6.157 to before 6.6.160; 6.12.109 to before 6.12.114; 6.18.50 to before 6.18.58; 7.2.4 to before 7.2.11 Fixed in 5.10.273, 5.15.224, 6.1.191, 6.6.160, 6.12.114, 6.18.58, 7.2.11 Patch available CNA
Remediation
Linux kernel stable releases 5.10.273, 5.15.224, 6.1.191, 6.6.160, 6.12.114, 6.18.58 and 7.2.11 fix it. Red Hat Enterprise Linux 10, 7, 8, 9 and OpenShift Container Platform 4 have no fix available, and Red Hat Enterprise Linux 6 has no fix planned.
Written with Claude Haiku 5.5 from the sources below · 2026-10-30
- Fix · CNA Linux (Linux) Fixed in 5.10.273, 5.15.224, 6.1.191, 6.6.160, 6.12.114, 6.18.58, 7.2.11
Vendor assessments
Red Hat
Red Hat rating: Moderate. Red Hat's page for this CVE →
| Product | Status | Plan or fix |
|---|---|---|
| Red Hat Enterprise Linux 10 | Affected | No fix yet: Fix deferred |
| Red Hat Enterprise Linux 6 | Affected | No fix planned: Out of support scope |
| Red Hat Enterprise Linux 7 | Affected | No fix yet: Fix deferred |
| Red Hat Enterprise Linux 8 | Affected | No fix yet: Fix deferred |
| Red Hat Enterprise Linux 9 | Affected | No fix yet: Fix deferred |
| Red Hat OpenShift Container Platform 4 | Affected | No fix yet: Fix deferred |
Timeline
- 2026-10-23 Threatist record created from CVE-2026-99009
- 2026-10-23 Alias added: GHSA-5rpp-jh2w-vm6p
- 2026-10-29 Affected versions changed · Red Hat
- 2026-10-29 CVSS score added · Red Hat
- 2026-10-30 Fix available: Linux/Linux@172b152119643018a2ed792e5096f33a4491c7de, Linux/[email protected], Linux/[email protected] +3 · CNA
- 2026-10-30 3 new references · CNA
References
Other 8
- https://git.kernel.org/stable/c/d7a3bf6f55ab77d465206b25fe3418091c3d4b92
- https://git.kernel.org/stable/c/172b152119643018a2ed792e5096f33a4491c7de
- https://git.kernel.org/stable/c/caf78390f78a005d5cdc1db2eb467b2794bbf020
- https://git.kernel.org/stable/c/4dc3d5a004b8fd59f3c905631dbb18cb601b1b41
- https://git.kernel.org/stable/c/d2206e8c78be69d21d4f5343c3e99fbaeef41cbb
- https://git.kernel.org/stable/c/cc7732b8549ecb6f02457edeb8db1f6d255e381c
- https://git.kernel.org/stable/c/f492de11b325446b0b11bc2eb86e1f546eaa61b6
- https://git.kernel.org/stable/c/ac022970e9fb0a5f7e7d1f6c8e104c1ed924dd1c
More Linux vulnerabilities
- TI-2025-26358 tls: fix handling of zero-length records on the rx_list KEVCVSS 3.1CRITICAL 9.8
- TI-2026-38352 netfilter: bridge: make ebt_snat ARP rewrite writable KEVCVSS 3.1HIGH 8.8
- TI-2021-02452 Incorrect authorization in Ubuntu linux kernel KEVCVSS 3.1HIGH 8.8
- TI-2013-05264 The (1) get_user and (2) put_user API functions in the Linux kernel before 3.5.5 on the… KEVCVSS 3.1HIGH 8.8
- TI-2022-00125 Integer overflow in kernel KEVCVSS 3.1HIGH 8.4
- TI-2013-01864 The perf_swevent_init function in kernel/events/core.c in the Linux kernel before 3.8.9… KEVCVSS 3.1HIGH 8.4
Sources
- CVE-2026-99009 · CVE Program
- CVE-2026-99009 · NVD
- FIRST EPSS
- GHSA-5rpp-jh2w-vm6p · GitHub Advisory Database · CC BY 4.0
- CVE-2026-99009 · Red Hat security data · CC BY 4.0
This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences