CVE-2026-98610

CVE-2026-98610

published October 18, 2026

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

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

net/sched: sch_hfsc: bound the classify inner-filter walk with a drift budget

hfsc_classify() applies the "filter may only point downwards" level check

only when the filter result carries no bound class. A filter created with

a flowid gets res.class set once at bind time, so the check never runs for

it during classification. hfsc_adjust_levels() can later raise a class's

level without revalidating existing bindings, leaving two binds that were

each legal at bind time pointing at each other; the classify walk then

bounces between two interior classes forever with the qdisc lock held and

BH disabled — a soft lockup from a single packet. The stuck walk trips

the watchdog:

watchdog: BUG: soft lockup - CPU#3 stuck for 13s! [ping:444]

RIP: 0010:u32_classify+0x542/0x17f0

...

tcf_classify+0x66/0xa0

hfsc_enqueue+0x166/0xdf0

Bound the traversal with a budget of non-descending hops, the only way a

configured walk can move without descending the class tree once levels

drift after bind time. The budget is cumulative over the whole walk and

is deliberately not reset on a descending hop: a chain that alternates a

descent with a lateral hop would return the budget every lap and never

trip. Descending hops never decrement it, so legitimately deep trees are

unaffected and a terminating lateral chain still classifies normally.

Drop the packet with a rate-limited warning once the budget is exhausted,

mirroring the merged HTB fix.

This is a follow-up to commit 729c4896ab82 ("net/sched: sch_htb: limit

htb_classify inner-class filter hops"), which bounded the same classify

loop on the HTB side but left the HFSC walk unbounded.

Conditions to recreate the bug:

- CONFIG_NET_SCHED, CONFIG_NET_SCH_HFSC, CONFIG_NET_CLS_U32,

CONFIG_LOCKUP_DETECTOR.

- Build a cycle with two legal-at-bind-time flowid binds and a level

drift: class X 1:1 (child of root) with leaf child 1:10; class Y 1:2

(sibling of X) with children 1:20 and 1:200; root u32 filter flowid

1:1; filter on X flowid 1:2 (legal when Y is a leaf); after Y's level

rises to 2, filter on Y flowid 1:1 (legal then). Send one packet (ping

on the device). Unfixed kernel: classify spins with the qdisc lock

held; with softlockup_panic=1 it panics.

- Reachable from unprivileged user via unshare -Urn (CAP_NET_ADMIN).

The record
Technical detail
CVSS
Not scored
CVSS v4.0
Not supplied
EPSS
0.00210 · 10.7th percentile
Published
2026-10-18T20:17Z
References (8)
EPSS history
Timeline
  • 20 OCT 03:34Z
    EPSS moved — → 0%
    epss
  • 18 OCT 15:19Z
    net/sched: sch_hfsc: bound the classify inner-filter walk with a drift budget
    cvelistv5
  • 18 OCT 15:19Z
    net/sched: sch_hfsc: bound the classify inner-filter walk with a drift budget
    cvelistv5