CVE-2026-98629
NoneCVSS
—
EPSS
0.2%
Published
Oct 18, 2026
CISA due date
—
Cloudanix analysis
A recent Linux kernel bug can make certain network traffic rules interfere with each other, potentially causing leaks, crashes, or traffic to be handled incorrectly.
- Exploitation
- Local Privilege
- Attacker needs
- Local User
- Complexity
- Moderate
- Impact
- Data Tampering
- Component
- OS kernel
- Class
- Memory Corruption
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
IDR key domain mismatch between raw handle and handle2id() for manual u32 divisor tables in 0x800-0xFFF range causes permanent IDR leaks on delete, accidental freeing of unrelated auto-allocated entries, and subsequent handle aliasing that makes u32_lookup_ht() route to the wrong table.
Why it matters to the business
Linux systems performing advanced traffic classification with tc u32 filters may experience kernel memory leaks, misclassified packets, or crashes when manual handles collide with auto-allocated ones, affecting network policy enforcement and stability.
How an attack unfolds
An attacker with CAP_NET_ADMIN creates a dummy interface and clsact qdisc, adds a manual u32 divisor table using a handle in the colliding range, then triggers delete/add sequences or concurrent auto allocations; the resulting alias causes lookups and TCA_U32_LINK actions to operate on the wrong table, enabling traffic misdirection or kernel instability.
How to fix it
Upgrade the Linux kernel to a version containing the fix that keys divisor-path allocations on handle2id(handle) and rejects colliding manual handles with -ENOSPC.
How to confirm the fix worked
After patching, repeat the provided reproduction commands; confirm that the auto-allocated hnode receives a non-colliding id and that repeated add/delete of manual tables succeeds without -ENOSPC.
Typical attack path
- Obtain CAP_NET_ADMIN on target host
- Create network device and clsact qdisc
- Add manual u32 divisor table with handle in 0x800-0xFFF range
- Add or delete additional u32 tables to trigger IDR aliasing
- Observe or abuse resulting lookup misdirection or resource corruption
How to detect it
Inspect kernel logs for cls_u32 related warnings or -ENOSPC on filter operations; review tc -d filter show output for duplicate fh values or unexpected hnode ids; examine audit logs for privileged tc commands creating manual u32 tables.
- fh 801:.*u32 divisor
- handle 0x80100000
- u32_lookup_ht
- ENOSPC.*manual table
What your security team should do
- Prioritize kernel updates on systems that use tc u32 classifiers with explicit manual handles
- Audit tc filter configurations for manual divisor tables using handles 0x800: and above
- Monitor for unusual -ENOSPC errors or unexpected fh handle values in tc -d filter output
The record
In the Linux kernel, the following vulnerability has been resolved: net/sched: cls_u32: fix manual hash table handle IDR aliasing A u32 hash table created with an explicit handle ('tc filter add ... handle 801: u32 divisor N') keys its IDR entry on the raw handle, while the destroy paths free it under handle2id(handle). The two key domains disagree for handles in the 0x800..0xFFF htid range: handle2id() folds them back into the auto-allocated id space (1..0x7FF). A manual table therefore leaves its raw-keyed IDR entry unreachable on delete (a permanent leak), and its delete can drop the idr entry of an unrelated live auto table. A later auto allocation can then hand out a handle that aliases the live manual table; u32_lookup_ht() first-match routes lookups and TCA_U32_LINK for that htid to the wrong table. Key the divisor-path alloc on handle2id(handle) so allocation and removal share one key domain. A manual handle that maps onto an id already in use is rejected with -ENOSPC, and auto allocation skips ids held by live manual tables. Conditions to recreate: ip link add test0 type dummy tc qdisc add dev test0 clsact tc filter add dev test0 ingress protocol ip pref 1 \ handle 801: u32 divisor 16 tc filter add dev test0 ingress protocol ip pref 2 u32 divisor 16 tc -d filter show dev test0 ingress | grep 'fh 801:' # unpatched: two live tables with handle 0x80100000 (the pref 2 root # hnode is auto-allocated id 1); patched: the auto hnode takes id 2. Also tested with a poc with a live u32 table on the block, add/delete a manual table 'handle 901: u32 divisor 1' twice; unpatched, the re-add fails with -ENOSPC because the raw key leaked on the first delete.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|