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

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

CVE-2026-90407

wifi: ath11k: fix overreads in ath11k_wmi_process_csa_switch_count_event()

7.7 EPSS 0.2% AV:L

Published 2026-09-17 (31 days ago) by the Linux kernel CNA. Subsystem drivers/net. Debian urgency: not yet assigned.

What to do, per Debian release

Debian's own status for CVE-2026-90407 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 12bookwormvulnerable6.1.190-1No fix published anywhere yet, neither in Debian nor upstream for the series bookworm tracks. Watch the Debian tracker page for this CVE. Advisories for bookworm have historically landed a median of 23 days after publication.
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

There is no policy entry for WMI_TAG_PDEV_CSA_SWITCH_COUNT_STATUS_EVENT, so the parse infrastructure does not enforce a minimum length for the event struct. Additionally, the num_vdevs field is taken directly from firmware and used as a loop bound over the vdev_ids array without checking that it fits within the TLV payload. Either condition can cause an out-of-bounds read. Add a TLV policy entry for WMI_TAG_PDEV_CSA_SWITCH_COUNT_STATUS_EVENT so the parse infrastructure enforces a minimum length for the fixed-size event struct. Add a helper ath11k_wmi_tlv_data_len() to recover the payload length of a parsed TLV from the header preceding its data pointer. Use it in ath11k_wmi_process_csa_switch_count_event() to bound num_vdevs before the loop. Compile tested only.

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.

drivers/net/wireless/ath/ath11k/wmi.c

What this is
QUALCOMM ATHEROS ATH11K WIRELESS DRIVERMAINTAINERS section matched on drivers/net/wireless/ath/ath11k/ · linux-wireless@vger.kernel.org · Supported
Kernel module
ath11k

Check it on the machine

grep -wE 'CONFIG_ATH11K|CONFIG_WLAN|CONFIG_WLAN_VENDOR_ATH' /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 ath11k

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 switches
CONFIG_ATH11K, CONFIG_WLAN, CONFIG_WLAN_VENDOR_ATH
Reads as
all on means the file is compiled; any one off means it is not.

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-17 (31 days ago)source
CVSS
7.7 high
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:Hsource recompute it
Attack vector
local (AV:L)source
EPSS
0.18%, higher than 7.3% of all CVEssource
CISA KEV
not listedthe KEV catalogue
Debian urgency
not yet assignedsource
Subsystem
drivers/net

Upstream fixes

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

IntroducedFixed inCommit
5.66.6.157f760b7d7e435
5.66.12.110d6625dc5f1fe
5.66.18.520364926fb4bf
5.67.2.65de2b8c53714
5.67.3208d7fdb8597

Debian advisories

AdvisoryDateShipped toDebian
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:LAttack vector, local
The malformed bytes are firmware WMI_PDEV_CSA_SWITCH_COUNT_STATUS_EVENTID TLVs on CE2 (ath11k_ce_recv_process_cb → ath11k_htc_rx_completion_handler → ath11k_wmi_tlv_op_rx). num_vdevs and the event/ARRAY_UINT32 lengths are built by firmware, not taken from an 802.11 CSA IE, so this is a host-firmware HTC path, not WiFi frame injection.
AC:LAttack complexity, low
wmi_tlv_policies had no min_len for WMI_TAG_PDEV_CSA_SWITCH_COUNT_STATUS_EVENT, and ath11k_wmi_process_csa_switch_count_event() used ev->num_vdevs as the vdev_ids[] bound with no compare to the ARRAY_UINT32 TLV length. Firmware setting current_switch_count=0 and an oversized num_vdevs makes the overread deterministic, with no race.
PR:NPrivileges required, none
ath11k_wmi_tlv_op_rx() dispatches WMI_PDEV_CSA_SWITCH_COUNT_STATUS_EVENTID from the WMI HTC rx callback with no host uid, capability, or authentication check; the device firmware is the sole source of the event struct and vdev_ids array.
UI:NUser interaction, none
Firmware can send WMI_PDEV_CSA_SWITCH_COUNT_STATUS_EVENTID unsolicited on the WMI RX path; the overread of ev->current_switch_count/num_vdevs and vdev_ids[i] runs before the csa_active check and does not require the victim to start a channel switch, mount media, or open a file.
S:UScope, unchanged
The out-of-bounds loads of ev fields and vdev_ids[] stay inside the host kernel ath11k WMI parser and the CE RX skb heap; they do not cross a VM, IOMMU, or other separate security authority.
C:HConfidentiality impact, high
ev->num_vdevs is a firmware u32 used as an unbounded index over vdev_ids[], so a count past the ARRAY_UINT32 TLV reads kernel heap beyond the WMI skb; unknown ids are also printed by ath11k_warn("Recvd csa status for unknown vdev %d"). That is not a few-byte leak.
I:NIntegrity impact, none
The loop only reads vdev_ids[i] into ath11k_mac_get_arvif_by_vdev_id(); it never writes through the overread pointer. ieee80211_csa_finish() runs only if a looked-up vif already has csa_active, which is not an OOB write or hijack primitive from the overread.
A:HAvailability impact, high
A firmware-chosen num_vdevs that walks vdev_ids[] past the CE RX skb can load from unmapped heap and oops/panic in ath11k_wmi_process_csa_switch_count_event(), which is a full kernel availability loss.