data built 2026-10-19T13:16:53Z

Look up another CVE · open CVE-2026-89583 in the interactive tracker

CVE-2026-89583

Bluetooth: eir: Fix OOB read in eir_get_service_data()

8.1 EPSS 0.3% AV:A

Published 2026-09-11 (37 days ago) by the Linux kernel CNA. Subsystem net/bluetooth. Debian urgency: not yet assigned.

What to do, per Debian release

Debian's own status for CVE-2026-89583 in every release this site tracks, and what each one means in practice. Every status below is the one the Debian Security Team publishes for this CVE. source

ReleaseStatus VersionWhat this means
Debian 12bookwormfixedDLA-4841-1 · 2026-10-17 · text6.1.190-1Update the kernel and reboot. DLA-4841-1 shipped the fix on 2026-10-17, in 6.1.190-1. A running kernel keeps the old code until the machine restarts.
Debian 13trixiefixedDSA-6528-1 · 2026-09-29 · text6.12.111-1Update the kernel and reboot. DSA-6528-1 shipped the fix on 2026-09-29, in 6.12.111-1. A running kernel keeps the old code until the machine restarts.
Debian 14forkyfixed7.2.6-1Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts.
Debian unstablesidfixed7.2.6-1Update the kernel and reboot. Fixed in 7.2.6-1. A running kernel keeps the old code until the machine restarts.
Debian 12bookworm · linux-6.12fixedDLA-4817-1 · 2026-10-04 · text6.12.111-1~deb12u1Update the kernel and reboot. DLA-4817-1 shipped the fix on 2026-10-04, in 6.12.111-1~deb12u1. A running kernel keeps the old code until the machine restarts.

The vulnerability

What the bug is

eir_get_service_data() walks the advertising data for a Service Data field with a matching UUID. On a mismatch it advances: eir += dlen; eir_len -= dlen; eir_get_data() reports dlen as the field's data length, but the field spans dlen + 2 bytes once its length and type bytes count, and more when non-Service-Data fields were skipped to reach it. The pointer lands correctly on the next field. eir_len does not, and the shortfall compounds across fields until eir_get_data() reads the length and type bytes of a "field" past the end of the buffer. For an ISO broadcast sink that buffer is hcon->le_per_adv_data[], filled from the periodic advertising reports of a remote broadcaster. A PA payload packed with mismatching Service Data fields walks off the array into the rest of struct hci_conn. A drifted field that matches the BAA UUID puts those bytes in iso_pi(sk)->base, where user space reads them back with getsockopt(BT_ISO_BASE). Recompute eir_len from the end of the buffer each iteration.

Where it lives

The fix touches these files. If the subsystem is one you do not use, the practical exposure is lower, though the package is still the vulnerable one.

net/bluetooth/eir.c

What this is
BLUETOOTH SUBSYSTEMMAINTAINERS section matched on net/bluetooth/ · linux-bluetooth@vger.kernel.org · Supported
Kernel module
bluetooth

Check it on the machine

grep -w CONFIG_BT /boot/config-$(uname -r)

Reads the booted kernel's own configuration, on the machine and nowhere else. =y is built in, =m is a module, and an is not set line means the code is not there.

lsmod | grep -w bluetooth

Prints a line if that module is loaded right now, and nothing if it is not. One that is not loaded can still be loaded later by anything that needs it.

Show whether Debian builds this, per release

Debian builds this, but not on every flavour. At least one release below builds the code on some of its kernel flavours and not on others, so the answer depends on the architecture and flavour installed.

  • bookwormMnot built on amd64/cloud-amd64, arm64/cloud-arm64
  • trixie, forky, sidMnot built on amd64/cloud-amd64, arm64/cloud-arm64, s390x/s390x
  • bookworm · linux-6.12Mnot built on amd64/cloud-amd64, arm64/cloud-arm64
M
a module where it is built at all; some flavours do not build it
Build switch
CONFIG_BT

From the configuration Debian publishes for every kernel flavour it builds. It covers only the architectures Debian ships a linux-config package for, and nothing about a kernel you built yourself. Debian's own status above stays authoritative about the source package.MAINTAINERS kbuild Makefiles Debian linux-config packages

Signals

Published
2026-09-11 (37 days ago)source
CVSS
8.1 high
CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:Hsource recompute it
Attack vector
adjacent network (AV:A)source
EPSS
0.27%, higher than 17.6% of all CVEssource
CISA KEV
not listedthe KEV catalogue
Debian urgency
not yet assignedsource
Subsystem
net/bluetooth

Upstream fixes

The versions the CNA records as introducing and fixing this, and the commit for each. source

IntroducedFixed inCommit
5.196.1.188b6902adf81ea
5.196.6.1571a28aae7f1fc
5.196.12.109815fc98c227a
5.196.18.50c21fa79301d7
5.197.2.4bb56e97bd676
5.197.34beb198bc59b

Debian advisories

AdvisoryDateShipped toDebian
DLA-4841-12026-10-17bookworm 6.1.190-1tracker
DLA-4817-12026-10-04bookworm 6.12.111-1~deb12u1tracker
DSA-6528-12026-09-29trixie 6.12.111-1tracker

Why the CNA scored it this way

Quoted from the kernel CNA's own scoring file, word for word. A highlighted metric carries the most severe value CVSS v3.1 defines for it, which is what pushes the score up. source

AV:AAttack vector, adjacent network
The OOB read is in eir_get_service_data() parsing LE periodic advertising. An ISO broadcast sink copies HCI_EV_LE_PER_ADV_REPORT payloads from a remote broadcaster into hcon->le_per_adv_data[] via iso_connect_ind(), which is an adjacent Bluetooth radio path, not IP or a local-only syscall.
AC:LAttack complexity, low
An in-range attacker fully controls the PA payload and can pack mismatching Service Data fields to inflate eir_len, then a trailing BAA-UUID field whose declared length extends past the buffer; triggering is deterministic with no race or layout the attacker cannot influence.
PR:NPrivileges required, none
Periodic advertising is unauthenticated connectionless LE traffic; iso_connect_ind() parses PA reports with no pairing, HCI authentication, or capability check, and iso_sock_create() has no CAP_NET_ADMIN gate, so the attacker needs no Linux credentials on the victim.
UI:NUser interaction, none
LE Audio/Auracast stacks keep ISO broadcast-sink listeners during normal operation; once PA sync exists, iso_connect_ind() parses each HCI_EV_LE_PER_ADV_REPORT automatically and returns HCI_LM_ACCEPT without further user clicks, pairing, or setup.
S:UScope, unchanged
The out-of-bounds read of struct hci_conn and the copy into the ISO socket BASE buffer remain in the host kernel Bluetooth stack and do not cross a VM, container, or IOMMU security boundary.
C:HConfidentiality impact, high
Inflated eir_len lets a matching BAA (0x1851) Service Data field extend past the 1650-byte le_per_adv_data[] into the rest of hci_conn; up to BASE_MAX_LENGTH (248) bytes are memcpy'd into iso_pi(sk)->base and returned via getsockopt(BT_ISO_BASE), leaking kernel pointers and adjacent object bytes.
I:NIntegrity impact, none
This is an out-of-bounds read only; the memcpy into iso_pi(sk)->base is capped by BASE_MAX_LENGTH, and there is no out-of-bounds write, use-after-free, or control-flow hijack primitive.
A:HAvailability impact, high
Continuing the EIR walk with an overstated remaining length can read hundreds of bytes past le_per_adv_data[] into adjacent slab or unmapped memory, causing a kernel oops or KASAN panic that the attacker can retrigger with further PA reports.