CVE-2025-22023

usb: xhci: Don't skip on Stopped - Length Invalid

published April 16, 2025

CVSS
—
EPSS
0%
Percentile
8.9
In the wild
Unconfirmed
What it is

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

usb: xhci: Don't skip on Stopped - Length Invalid

Up until commit d56b0b2ab142 ("usb: xhci: ensure skipped isoc TDs are

returned when isoc ring is stopped") in v6.11, the driver didn't skip

missed isochronous TDs when handling Stoppend and Stopped - Length

Invalid events. Instead, it erroneously cleared the skip flag, which

would cause the ring to get stuck, as future events won't match the

missed TD which is never removed from the queue until it's cancelled.

This buggy logic seems to have been in place substantially unchanged

since the 3.x series over 10 years ago, which probably speaks first

and foremost about relative rarity of this case in normal usage, but

by the spec I see no reason why it shouldn't be possible.

After d56b0b2ab142, TDs are immediately skipped when handling those

Stopped events. This poses a potential problem in case of Stopped -

Length Invalid, which occurs either on completed TDs (likely already

given back) or Link and No-Op TRBs. Such event won't be recognized

as matching any TD (unless it's the rare Link TRB inside a TD) and

will result in skipping all pending TDs, giving them back possibly

before they are done, risking isoc data loss and maybe UAF by HW.

As a compromise, don't skip and don't clear the skip flag on this

kind of event. Then the next event will skip missed TDs. A downside

of not handling Stopped - Length Invalid on a Link inside a TD is

that if the TD is cancelled, its actual length will not be updated

to account for TRBs (silently) completed before the TD was stopped.

I had no luck producing this sequence of completion events so there

is no compelling demonstration of any resulting disaster. It may be

a very rare, obscure condition. The sole motivation for this patch

is that if such unlikely event does occur, I'd rather risk reporting

a cancelled partially done isoc frame as empty than gamble with UAF.

This will be fixed more properly by looking at Stopped event's TRB

pointer when making skipping decisions, but such rework is unlikely

to be backported to v6.12, which will stay around for a few years.

The record
Technical detail
CVSS
Not scored
CVSS v4.0
Not supplied
EPSS
0.00197 · 8.9th percentile
Published
2025-04-16T10:23Z
EPSS history
Timeline
  • 16 APR 10:23Z
    usb: xhci: Don't skip on Stopped - Length Invalid
    cvelistv5