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: 5.5 Medium
EPSS: < 1% Very Low
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 score for this vulnerability is 5.5, indicating a medium‑severity denial‑of‑service impact. The EPSS score is <1%, suggesting a low probability of exploitation in the wild, and the vulnerability is not listed in the CISA KEV catalog. Nevertheless, the flaw can be triggered from user space without elevated privileges by applying a u32 filter with a dropped flowid binding that drifts in level; a single packet such as ping will cause the infinite classification walk, a soft lockup that can ultimately lead to a kernel panic. The attack vector is local, relying on the ability to configure the HFSC qdisc and u32 classifier, which can be performed by any user with CAP_NET_ADMIN privileges through the unshare-Urn mechanism.

Generated by OpenCVE AI on October 22, 2026 at 21:47 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 22, 2026 at 21:47 UTC.

Tracking

Sign in to view the affected projects.

Advisories
Source ID Title
Debian DLA Debian DLA DLA-4850-1 linux-6.12 security update
Ubuntu USN Ubuntu USN USN-8961-1 Linux kernel vulnerabilities
History

Wed, 21 Oct 2026 12:30:00 +0000

Type Values Removed Values Added
Weaknesses CWE-835
References
Metrics threat_severity

None

cvssV3_1

{'score': 5.5, 'vector': 'CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H'}

threat_severity

Moderate


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-19T09:22:37.236Z

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-19T10:19:23.103

Link: CVE-2026-98610

cve-icon Redhat

Severity : Moderate

Publid Date: 2026-10-18T00:00:00Z

Links: CVE-2026-98610 - Bugzilla

cve-icon OpenCVE Enrichment

Updated: 2026-10-22T22:00:15Z

Weaknesses
  • CWE-739
  • CWE-835

    Loop with Unreachable Exit Condition ('Infinite Loop')