CVE-2026-74488

CVE-2026-74488

High · published August 15, 2026

CVSS v3.1
8.8
EPSS
0%
Percentile
16.1
In the wild
Unconfirmed
What it is

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

wifi: mwifiex: use the subframe length when parsing A-MSDU TDLS frames

mwifiex_11n_dispatch_amsdu_pkt() splits an A-MSDU with

ieee80211_amsdu_to_8023s() and walks the resulting subframes. For each

subframe it passes the subframe data pointer to

mwifiex_process_tdls_action_frame(), but pairs it with skb->len, the

length of the A-MSDU parent, instead of rx_skb->len:

rx_skb = __skb_dequeue(&list);

rx_hdr = (struct rx_packet_hdr *)rx_skb->data;

if (ISSUPP_TDLS_ENABLED(priv->adapter->fw_cap_info) &&

ntohs(rx_hdr->eth803_hdr.h_proto) == ETH_P_TDLS) {

mwifiex_process_tdls_action_frame(priv, (u8 *)rx_hdr,

skb->len);

}

The parent is not a valid description of that buffer, and may not be

valid memory at all. ieee80211_amsdu_to_8023s() ends with

if (!reuse_skb)

dev_kfree_skb(skb);

and it only sets reuse_skb when the parent is linear, is not a

head_frag, and is being consumed as the *last* subframe. So when the

parent does not qualify for reuse it has already been freed, and the

read of skb->len is a use-after-free. When it is reused, skb->len is

the length of the last subframe, applied to every earlier subframe,

which over-states the buffer whenever an earlier subframe is shorter.

The callee cannot absorb a wrong length, because it derives its own

ceiling from the value it is given. Each frame type computes

ies_len = len - sizeof(struct ethhdr) - TDLS_*_FIX_LEN;

and the element walk is then bounded entirely against that ceiling,

for (end = pos + ies_len; pos + 1 < end; pos += 2 + pos[1]) {

u8 ie_len = pos[1];

if (pos + 2 + ie_len > end)

break;

so a too-large len moves end past the end of the subframe and the walk

reads and copies beyond it. The A-MSDU layout is chosen by the sender,

which makes the difference between the last subframe and a shorter

earlier one remotely selectable. Reaching this requires TDLS support in

firmware and the TDLS ethertype on the subframe.

The other caller, mwifiex_process_rx_packet(), is correct: it passes a

pointer and a length that describe the same region of the RX buffer.

Pass rx_skb->len, the length of the subframe actually being parsed.

The record
Technical detail
CVSS v3.1
8.8 · HIGH
Vector
CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CVSS v4.0
Not supplied
EPSS
0.00255 · 16.1th percentile
Published
2026-08-15T17:17Z
References (8)
EPSS history
Timeline
  • 15 AUG 12:27Z
    wifi: mwifiex: use the subframe length when parsing A-MSDU TDLS frames
    cvelistv5