Description
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).
Published: 2026-10-18
Score: n/a
EPSS: n/a
KEV: No
Impact: Denial of Service (soft lockup caused by infinite classify walk)
Action: Immediate patch
AI Analysis

Impact

A logic flaw in the Linux kernel’s HFSC scheduler allows an infinite classification walk when an inner‑filter binding satisfies a level drift after bind time. The walk never exits the locked class tree, holding the queue‑discipline lock, disabling bottom‑half processing and eventually triggering a CPU watchdog timeout, a classic soft lockup that can lead to a kernel panic. The problem is not an information disclosure but a complete denial of service on the impacted system, affecting both the responsiveness of the affected kernel and the reliability of any services running on it.

Affected Systems

All Linux kernel configurations that enable the HFSC qdisc (CONFIG_NET_SCHED and CONFIG_NET_SCH_HFSC) together with the u32 classifier (CONFIG_NET_CLS_U32) and the lockup detector (CONFIG_LOCKUP_DETECTOR). The bug can be triggered by any user that can apply a binding with CAP_NET_ADMIN through the unshare -Urn capability, meaning unprivileged users can develop the exploit. Vendors that ship kernels before the fix—regardless of version—are potentially vulnerable.

Risk and Exploitability

The CVSS severity for the described issue is high due to the unlimited loop and denial of service impact. Although the EPSS score is not available and the vulnerability is not listed in the CISA KEV catalog, the lack of a public exploit does not mitigate the risk: the bug can be exercised from user space with normal privileges and causes a system‑wide lockup without leaving a traceable network event. The attack vector is largely local, leveraging administrative configuration interfaces; an attacker simply applies the dangerous u32 filter configuration and sends a single packet (e.g., ping) to trigger the endless walk. Given the severity and the potential for a kernel panic, the vulnerability should be treated as a priority safety concern.

Generated by OpenCVE AI on October 18, 2026 at 22:42 UTC.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Apply the kernel patch that bounds the classify walk and limits the drift budget (available in the latest kernel releases).
  • If an immediate patch is not available, disable the HFSC qdisc entirely—remove or comment out CONFIG_NET_SCH_HFSC or prevent loading of sch_hfsc.
  • Avoid creating cycles in u32 filters with flowid bindings that could drift in level; ensure that all filter bindings are updated to use the latest kernel logic.

Generated by OpenCVE AI on October 18, 2026 at 22:42 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Sun, 18 Oct 2026 23:00:00 +0000

Type Values Removed Values Added
Weaknesses CWE-739

Sun, 18 Oct 2026 15:30:00 +0000

Type Values Removed Values Added
Description 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).
Title net/sched: sch_hfsc: bound the classify inner-filter walk with a drift budget
First Time appeared Linux
Linux linux Kernel
CPEs cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
Vendors & Products Linux
Linux linux Kernel
References

Subscriptions

Linux Linux Kernel
cve-icon MITRE

Status: PUBLISHED

Assigner: Linux

Published:

Updated: 2026-10-18T15:19:25.128Z

Reserved: 2026-09-25T10:25:14.360Z

Link: CVE-2026-98610

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Received

Published: 2026-10-18T16:17:13.793

Modified: 2026-10-18T16:17:13.793

Link: CVE-2026-98610

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-10-18T22:45:04Z

Weaknesses