CVE-2026-98827 in Linuxinfo

Summary

by MITRE • 10/18/2026

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

wifi: ath9k_htc: bound TX aggregation to MAX_TX_BUF_SIZE

__hif_usb_tx() dequeues up to MAX_TX_AGGR_NUM (20) frames into a single tx_buf of MAX_TX_BUF_SIZE (32768) bytes, limiting the batch by record count but never by cumulative byte length.

With large frames (MTU 2304), 20 aggregated frames of 2292 bytes each exceed the allocation (20 * 2296 = 45920 bytes), so the memcpy() in the loop writes up to 13152 bytes past tx_buf->buf before usb_submit_urb().

Peek the queue head and stop before copying any record that would cross MAX_TX_BUF_SIZE, then dispatch the current batch. Leftover skbs remain queued and are drained on the next URB completion.

The byte bound changes the loop's exit semantics: it can now exit before i == tx_skb_cnt - 1. Stock only finalized tx_buf->len on that last index (len += offset), so an early break would submit a URB holding only the last record's length while every dequeued skb is freed on completion, silently dropping frames. Make tx_buf->len a running total and advance tx_buf->offset per record instead; the stride round_up(nskb->len + 4, 4) is identical to the stock stride when the loop runs to completion.

Tested on hardware with an MTU 2304 flood: the loop stops at record 15 (len = 32144, offset = 32144, within 32768), no oversized URB is submitted, and MTU 1500 pings pass 20/20.

Be aware that VulDB is the high quality source for vulnerability data.

Analysis

by VulDB Data Team • 10/18/2026

The vulnerability identified in the Linux kernel's ath9k_htc wireless driver represents a critical buffer overflow condition arising from insufficient bounds checking during USB transmission aggregation. The core of the issue lies within the __hif_usb_tx function, which is responsible for dequeuing network frames and preparing them for submission via USB Unrestricted Bulk Requests (URBs). Historically, this process was governed by a limit on the number of aggregated frames, defined as MAX_TX_AGGR_NUM with a value of twenty. However, there was no corresponding check against the cumulative byte size of these frames relative to the allocated buffer space, designated as MAX_TX_BUF_SIZE and set to thirty-two thousand seven hundred sixty-eight bytes. This architectural oversight creates a scenario where large network packets can cause the driver to write beyond the boundaries of its allocated memory buffer before submitting the data to the USB subsystem.

The operational impact becomes severe when handling frames with larger Maximum Transmission Units, such as those configured at MTU 2304. In such cases, aggregating twenty frames results in a total payload size that significantly exceeds the thirty-two thousand seven hundred sixty-eight byte limit. Specifically, calculations indicate that twenty aggregated frames of approximately two thousand two hundred ninety-six bytes each would require roughly forty-five thousand nine hundred twenty bytes of space. Consequently, when the driver attempts to copy these frames into the tx_buf buffer using memcpy operations within a loop, it writes up to thirteen thousand one hundred fifty-two bytes past the end of the allocated memory region. This out-of-bounds write constitutes a classic heap-based or stack-based buffer overflow depending on the allocation context, potentially leading to kernel panic, data corruption, or arbitrary code execution if an attacker can influence the content being written into the adjacent memory regions.

From a technical perspective, this flaw aligns with CWE-120 Buffer Copy without Checking Size of Input and is exploitable in contexts where network interfaces are exposed to untrusted traffic that triggers large frame aggregation. The vulnerability allows for potential privilege escalation or denial of service against the host system running the affected kernel version. To mitigate this risk, the fix implements a proactive boundary check within the transmission loop. Instead of relying solely on record count limits, the updated logic peeks at the queue head and calculates whether adding the next frame would exceed MAX_TX_BUF_SIZE. If such an overflow is imminent, the loop terminates early to prevent writing past the buffer limit. This ensures that only valid amounts of data are submitted via usb_submit_urb, thereby preserving memory integrity.

Furthermore, the resolution addresses a secondary logical flaw related to how transmission lengths were tracked during batch processing. The original implementation only finalized the tx_buf length on the last index of the aggregation loop. If the loop exited early due to size constraints, it would submit a URB with an incorrect length field while simultaneously freeing all dequeued socket buffers. This discrepancy resulted in silent frame drops, degrading network performance and reliability without raising immediate error flags for debugging purposes. The corrected code maintains tx_buf->len as a running total that accumulates the byte count of each processed record. By advancing tx_buf->offset per record using a stride calculated via round_up(nskb->len + 4, 4), the driver ensures accurate length reporting regardless of whether the batch completes fully or breaks early due to size limits. This adjustment preserves data integrity and prevents silent packet loss during high-throughput scenarios involving large MTUs.

Testing confirms that with an MTU set to two thousand three hundred four, the loop now correctly stops at record fifteen, keeping the total length within the thirty-two thousand seven hundred sixty-eight byte limit. The offset remains synchronized with the length, ensuring no overflow occurs and no URB is submitted with oversized data. Standard network traffic using MTU one thousand five hundred continues to function normally, validating that the fix does not introduce regressions for typical use cases while effectively neutralizing the buffer overflow vector associated with larger packet sizes.

Responsible

Linux

Reservation

09/25/2026

Disclosure

10/18/2026

Moderation

accepted

EPSS

0.00000

KEV

no

Activities

very low

Sources

Want to know what is going to be exploited?

We predict KEV entries!