MEDIUM 5.5

CVE-2026-53080: Linux Kernel TC Classifier NULL Dereference DoS Vulnerability

A flaw in the Linux kernel's traffic control (TC) packet classifier subsystem can trigger a kernel crash. Specifically, when using the 'fw' (firewall mark) classifier on shared traffic control blocks, the kernel may attempt to process an invalid filter before it is fully initialized. This creates a race condition where incoming packets hit code paths that dereference NULL pointers, causing a kernel panic. The vulnerability is triggered by a sequence of TC filter additions on a shared egress block combined with active packet transmission. While the issue requires local access and a privileged user account to set up malicious TC rules, the crash itself is a denial of service against the entire system.

Source data · NVD / CISA · public domain

CVSS
3.1 · 5.5 MEDIUM · CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
Weaknesses (CWE)
CWE-476
Affected products
1 configuration(s)
Published / Modified
2026-06-24 / 2026-07-23

NVD description (verbatim)

In the Linux kernel, the following vulnerability has been resolved: net/sched: cls_fw: fix NULL dereference of "old" filters before change() Like pointed out by Sashiko [1], since commit ed76f5edccc9 ("net: sched: protect filter_chain list with filter_chain_lock mutex") TC filters are added to a shared block and published to datapath before their ->change() function is called. This is a problem for cls_fw: an invalid filter created with the "old" method can still classify some packets before it is destroyed by the validation logic added by Xiang. Therefore, insisting with repeated runs of the following script: # ip link add dev crash0 type dummy # ip link set dev crash0 up # mausezahn crash0 -c 100000 -P 10 \ > -A 4.3.2.1 -B 1.2.3.4 -t udp "dp=1234" -q & # sleep 1 # tc qdisc add dev crash0 egress_block 1 clsact # tc filter add block 1 protocol ip prio 1 matchall \ > action skbedit mark 65536 continue # tc filter add block 1 protocol ip prio 2 fw # ip link del dev crash0 can still make fw_classify() hit the WARN_ON() in [2]: WARNING: ./include/net/pkt_cls.h:88 at fw_classify+0x244/0x250 [cls_fw], CPU#18: mausezahn/1399 Modules linked in: cls_fw(E) act_skbedit(E) CPU: 18 UID: 0 PID: 1399 Comm: mausezahn Tainted: G E 7.0.0-rc6-virtme #17 PREEMPT(full) Tainted: [E]=UNSIGNED_MODULE Hardware name: Red Hat KVM, BIOS 1.16.3-2.el9 04/01/2014 RIP: 0010:fw_classify+0x244/0x250 [cls_fw] Code: 5c 49 c7 45 00 00 00 00 00 41 5d 41 5e 41 5f 5d c3 cc cc cc cc 5b b8 ff ff ff ff 41 5c 41 5d 41 5e 41 5f 5d c3 cc cc cc cc 90 <0f> 0b 90 eb a0 0f 1f 80 00 00 00 00 90 90 90 90 90 90 90 90 90 90 RSP: 0018:ffffd1b7026bf8a8 EFLAGS: 00010202 RAX: ffff8c5ac9c60800 RBX: ffff8c5ac99322c0 RCX: 0000000000000004 RDX: 0000000000000001 RSI: ffff8c5b74d7a000 RDI: ffff8c5ac8284f40 RBP: ffffd1b7026bf8d0 R08: 0000000000000000 R09: ffffd1b7026bf9b0 R10: 00000000ffffffff R11: 0000000000000000 R12: 0000000000010000 R13: ffffd1b7026bf930 R14: ffff8c5ac8284f40 R15: 0000000000000000 FS: 00007fca40c37740(0000) GS:ffff8c5b74d7a000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007fca40e822a0 CR3: 0000000005ca0001 CR4: 0000000000172ef0 Call Trace: <TASK> tcf_classify+0x17d/0x5c0 tc_run+0x9d/0x150 __dev_queue_xmit+0x2ab/0x14d0 ip_finish_output2+0x340/0x8f0 ip_output+0xa4/0x250 raw_sendmsg+0x147d/0x14b0 __sys_sendto+0x1cc/0x1f0 __x64_sys_sendto+0x24/0x30 do_syscall_64+0x126/0xf80 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7fca40e822ba Code: d8 64 89 02 48 c7 c0 ff ff ff ff eb b8 0f 1f 00 f3 0f 1e fa 41 89 ca 64 8b 04 25 18 00 00 00 85 c0 75 15 b8 2c 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 7e c3 0f 1f 44 00 00 41 54 48 83 ec 30 44 89 RSP: 002b:00007ffc248a42c8 EFLAGS: 00000246 ORIG_RAX: 000000000000002c RAX: ffffffffffffffda RBX: 000055ef233289d0 RCX: 00007fca40e822ba RDX: 000000000000001e RSI: 000055ef23328c30 RDI: 0000000000000003 RBP: 000055ef233289d0 R08: 00007ffc248a42d0 R09: 0000000000000010 R10: 0000000000000000 R11: 0000000000000246 R12: 000000000000001e R13: 00000000000186a0 R14: 0000000000000000 R15: 00007fca41043000 </TASK> irq event stamp: 1045778 hardirqs last enabled at (1045784): [<ffffffff864ec042>] __up_console_sem+0x52/0x60 hardirqs last disabled at (1045789): [<ffffffff864ec027>] __up_console_sem+0x37/0x60 softirqs last enabled at (1045426): [<ffffffff874d48c7>] __alloc_skb+0x207/0x260 softirqs last disabled at (1045434): [<ffffffff874fe8f8>] __dev_queue_xmit+0x78/0x14d0 Then, because of the value in the packet's mark, dereference on 'q->handle' with NULL 'q' occurs: BUG: kernel NULL pointer dereference, address: 0000000000000038 [...] RIP: 0010:fw_classify+0x1fe/0x250 [cls_fw] [...] Skip "old-style" classification on shared blocks, so that the NULL dereference is fixed and WARN_ON() is not hit anymore in the short lifetime of invalid cls_fw "old-style" filters. [1] https://sashiko.dev/#/patchset/2 ---truncated---

8 reference(s) · View on NVD →

SEC.co analysis · AI-assisted, reviewed against source

Technical summary

CVE-2026-53080 stems from a race condition in the cls_fw (firewall mark classifier) module within the Linux kernel's netlink-based TC subsystem. The root cause is a change in filter publication semantics: since commit ed76f5edccc9, filters are added to a shared filter chain and exposed to the datapath before their ->change() callback completes validation. For cls_fw, this means an invalid filter can briefly exist in the packet classification path. When packets arrive during this window, fw_classify() may attempt to dereference filter metadata on a NULL or partially-initialized filter object, specifically the handle field. The kernel's internal validation logic eventually destroys the bad filter, but not before triggering a WARN_ON() and potentially a NULL pointer dereference with a kernel panic (address 0x38 offset in the fw_classify function). The issue is exacerbated on shared blocks where multiple filters coexist and racing packet processing becomes more likely.

Business impact

A local unprivileged user with the ability to add TC rules—typically available to users in network or container namespaces—can crash the kernel and take down networking on the affected system. In containerized or multi-tenant environments, this becomes a lateral denial-of-service vector. In virtualized deployments, a guest user could crash the host kernel. The impact is primarily availability; no data exfiltration or privilege escalation occurs, but service disruption can be complete and immediate.

Affected systems

The Linux kernel is affected. The vulnerability stems from a change introduced in an earlier commit affecting the filter chain synchronization mechanism. Kernels running on systems where unprivileged users or container tenants can manipulate TC rules are at risk. This includes standard Linux distributions running on servers, workstations, and virtualized/containerized platforms. Embedded systems running Linux with exposed TC configuration are also affected if running a vulnerable kernel version.

Exploitability

Exploitation requires local access and the ability to execute TC (traffic control) commands, which typically requires CAP_NET_ADMIN capability or access to a namespace where such privileges are available. The attack is deterministic: the race condition can be reliably triggered by running the sequence of TC filter operations described in the CVE. A proof-of-concept script exists in the public record. No network access or special configuration is needed beyond the ability to add TC filters and transmit packets. Unprivileged container users in many orchestration platforms would have sufficient capability to trigger this.

Remediation

Apply a Linux kernel patch that prevents fw_classify() from operating on invalid 'old-style' filters on shared blocks. The fix involves skipping the old-style classification path in fw_classify() when the filter belongs to a shared block, eliminating the race condition window. This must be done through a kernel update from your distribution. Verify the patch version against your vendor's advisory, as mainline kernel patches may be backported with different version numbers across distributions.

Patch guidance

Contact your Linux distribution vendor (Red Hat, Debian, Ubuntu, etc.) for a kernel update addressing CVE-2026-53080. The fix is a targeted change to the cls_fw module's fw_classify() function. Prioritize this kernel update for systems where unprivileged users can execute TC commands or where container workloads are isolated by network namespaces. Testing in a non-production environment is recommended, though the patch itself is minimal and low-risk. Verify that the applied patch includes the specific fix to prevent old-style classification on shared blocks.

Detection guidance

Monitor kernel logs (dmesg, journalctl) for the WARN_ON message originating from net/sched/cls_fw.c line 88 and for NULL pointer dereference panics with RIP pointing to fw_classify(). This warning appears before the crash occurs. On affected systems, use network performance monitoring to detect unexpected kernel panics during TC rule manipulation. For container platforms, monitor system-level crashes correlated with container network policy changes or updates. Runtime security tools can watch for CAP_NET_ADMIN usage by unprivileged processes or containers as a precursor indicator.

Why prioritize this

This vulnerability merits prompt patching because it is a local denial-of-service vector with a low barrier to exploitation for anyone with CAP_NET_ADMIN privileges. In modern environments with containers, Kubernetes, and user namespaces, the effective attack surface is broad. While the CVSS score is medium (5.5), the real-world impact—complete system crash via local privilege escalation path—justifies high priority in cloud and container environments. The fix is stable and carries minimal risk.

Risk score, explained

The CVSS 3.1 score of 5.5 (MEDIUM) reflects an attack vector limited to local access and requiring moderate privileges (CAP_NET_ADMIN). The attack complexity is low, and the impact on availability is high (kernel crash). However, confidentiality and integrity are not affected. The score does not account for the broader attack surface in container and namespace-enabled systems where such privileges are more readily available to untrusted users, nor does it capture the severity of a full system crash. In those contexts, the practical risk is higher.

Frequently asked questions

Can this vulnerability be exploited remotely?

No. CVE-2026-53080 requires local access and the ability to execute TC (traffic control) commands, which necessitates the CAP_NET_ADMIN capability or equivalent namespace isolation. Remote attackers cannot trigger this vulnerability.

Does this affect systems where TC is not used?

The kernel module cls_fw may still be loaded in the running kernel even if not actively configured by the administrator. However, the vulnerability requires an active TC filter operation on a shared block to trigger the race condition. Systems that do not use TC or shared egress blocks are at lower risk, though the kernel patch is still recommended for defense in depth.

What is the difference between 'old-style' and new TC filter configuration?

The vulnerability specifically targets the 'old-style' or legacy method of configuring fw filters via netlink (the traditional 'tc filter add' command syntax). The fix prevents this code path from running on shared blocks where the race condition occurs. New or properly configured filters are not affected.

If a system crashes due to this vulnerability, is any data lost?

A kernel panic causes an immediate system halt and may result in loss of in-flight data not yet written to persistent storage (e.g., unsaved file buffers, in-memory database transactions). Data integrity on disk is not directly compromised, but applications may be interrupted ungracefully.

This analysis is provided for informational purposes by SEC.co and is based on publicly available vulnerability data as of the publication date. Patch version numbers and vendor advisory details should be verified against official vendor security bulletins. The vulnerability details, reproduction steps, and technical indicators are sourced from kernel commit messages and public disclosures. Organizations should test patches in non-production environments before deployment. This document does not constitute professional security advice; consult with your security team and vendor for deployment decisions specific to your infrastructure. Source: NVD (public-domain), retrieved 2026-08-01. Analysis generated by SEC.co (claude-haiku-4-5).