CVE-2026-90091

CVE-2026-90091

High · published September 17, 2026

CVSS v3.1
8.0
EPSS
0%
Percentile
27.6
In the wild
Unconfirmed
What it is

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

Bluetooth: L2CAP: fix race l2cap_sock_cleanup_listen() vs. put_chan

For L2CAP sockets without owning sk->sk_socket, reading

l2cap_pi(sk)->chan may race against concurrent l2cap_sock_kill() ->

l2cap_sock_put_chan(). This excludes simultaneous proto_ops callbacks,

but access in l2cap_sock_cleanup_listen() has unsafe lockless read.

[Task 1] [Task 2 (hdev->workqueue)]

l2cap_sock_release(parent) l2cap_disconn_cfm

l2cap_sock_cleanup_listen l2cap_conn_del

bt_accept_dequeue l2cap_chan_del

lock_sock(sk) l2cap_sock_teardown_cb

bt_accept_unlink

bt_sk(sk)->parent = NULL

release_sock(sk) ----------------> lock_sock(sk)

parent = /* NULL */

lock_sock(sk) <--------------------- release_sock(sk)

sock_set_flag(sk, SOCK_ZAPPED)

l2cap_sock_close_cb

l2cap_sock_kill(sk)

l2cap_sock_put_chan

chan = READ l2cap_pi(sk)->chan l2cap_pi(sk)->chan = NULL

l2cap_chan_hold_unless_zero l2cap_put_chan(chan)

kref_get_unless_zero(&chan->ref)

Task 1 may observe NULL which causes null-ptr-deref.

Fix the race by taking lock_sock() in l2cap_sock_kill() to

synchronize with l2cap_sock_cleanup_listen(). hold_unless_zero() is not

needed here, l2cap_pi(sk)->chan owns reference if it is non-NULL.

Clarify code comments vs. locking.

The record
Technical detail
CVSS v3.1
8.0 · HIGH
Vector
CVSS:3.1/AV:A/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00352 · 27.6th percentile
Published
2026-09-17T21:17Z
References (6)
EPSS history
Timeline
  • 19 SEP 03:55Z
    EPSS moved — → 0%
    epss
  • 17 SEP 16:06Z
    Bluetooth: L2CAP: fix race l2cap_sock_cleanup_listen() vs. put_chan
    cvelistv5