CVE-2026-98234
NoneCVSS
—
EPSS
0.2%
Published
Oct 6, 2026
CISA due date
—
Cloudanix analysis
A network configuration setting on Linux systems could be abused to consume all available memory, causing network services to stop working.
- Exploitation
- Local Privilege
- Attacker needs
- Low Privilege
- Complexity
- Low
- Impact
- Denial Of Service
- Component
- OS kernel
- Class
- Improper Input Validation
- Remediation
- Patch
- Effort
- Medium
- Patch risk
- Low
What it actually does
hhf_change() accepts an unbounded TCA_HHF_HH_FLOWS_LIMIT value that bypasses the hh_flows_current_cnt check in alloc_new_hh(), allowing an attacker-controlled number of fixed-size kzalloc(GFP_ATOMIC) allocations per spoofed heavy-hitter flow and resulting in unbounded kernel memory growth.
Why it matters to the business
Systems configured with the HHF qdisc can be driven into memory exhaustion and denial of service by an administrator-level user, disrupting network traffic shaping on Linux hosts or appliances that expose tc configuration.
How an attack unfolds
An attacker with CAP_NET_ADMIN in a user namespace issues a tc qdisc change command that sets hh_limit to a huge value such as 4294967295; the kernel stores the value without clamping. Subsequent spoofed traffic then triggers repeated alloc_new_hh() calls that each allocate memory without hitting the flow-count limit, exhausting kernel memory.
How to fix it
Upgrade the kernel to a version containing commit that applies NLA_POLICY_MAX(2*HH_FLOWS_CNT) to TCA_HHF_HH_FLOWS_LIMIT and moves the default hh_flows_limit assignment before the hhf_change() call. Reconfigure any HHF qdisc instances after the upgrade; values above the new cap are rejected with an extack message.
How to confirm the fix worked
After patching, attempt tc qdisc change with hh_limit 4294967295 and confirm the command is rejected; verify tc qdisc show reports a value no larger than 2*HH_FLOWS_CNT. Inspect the qdisc source for the NLA_POLICY_MAX line and the reordered default assignment in hhf_init().
Typical attack path
- Obtain CAP_NET_ADMIN capability inside a user namespace on a Linux system using the HHF qdisc.
- Run tc qdisc change (or add) with hh_limit set to a value larger than 2*HH_FLOWS_CNT.
- Generate spoofed traffic that creates many new heavy-hitter flows.
- Observe repeated kzalloc calls in alloc_new_hh() that are no longer rate-limited by hh_flows_current_cnt.
- Continue traffic until kernel memory is exhausted and the system becomes unresponsive.
How to detect it
Review audit logs or command history for invocations of tc that set hh_limit to extremely large values; examine kernel memory allocation traces or slab statistics for unexpected growth of hh_flow objects after a qdisc change; look for extack rejection messages once the fix is applied.
What your security team should do
- Prioritize kernel updates on any system exposing tc or using HHF qdisc in production network paths.
- Audit existing tc configurations for custom hh_limit settings above the default of 2048 and reduce them to supported values.
- Restrict CAP_NET_ADMIN to trusted processes and namespaces only.
- Monitor kernel memory usage on hosts that perform traffic shaping with HHF.
The record
In the Linux kernel, the following vulnerability has been resolved: net/sched: hhf: cap hh_flows_limit at change time hhf_change() stores TCA_HHF_HH_FLOWS_LIMIT with no upper bound. A huge hh_flows_limit lets each new heavy-hitter flow pass the hh_flows_current_cnt check in alloc_new_hh() and forces a fixed-size kzalloc(GFP_ATOMIC) per flow under spoofed traffic, for unbounded memory growth. Bound the attribute with NLA_POLICY_MAX() at 2*HH_FLOWS_CNT (the hhf_init() default) and report the rejected value via extack. The deprecated nested parse is kept: legacy tc does not set NLA_F_NESTED on TCA_OPTIONS. Configs relying on hh_limit above the default were relying on unbounded, unsafe behaviour and are not supported going forward. hhf_init() also ran hhf_change() before setting the default hh_flows_limit, so a user-supplied hh_limit at add time was clobbered back to 2048. Set the default before hhf_change() so the configured value sticks. This is a follow-up to commit eb56a495f59b ("net/sched: hhf: clamp quantum in change and init paths"), which bounded the quantum of the same qdisc; the hh_flows_limit bound is the remaining unbounded knob of that series' scope. Conditions to recreate the bug: CAP_NET_ADMIN in a user namespace; tc qdisc change dev X root hhf hh_limit 4294967295 succeeds and the value is echoed by tc qdisc show, unbounding heavy-hitter flow allocations; also tc qdisc add dev X root hhf hh_limit 500 stores 2048 instead of 500.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|