CVE-2026-53080
NoneCVSS
—
EPSS
0.1%
Published
Jun 24, 2026
CISA due date
—
Cloudanix analysis
A local user or workload with advanced network configuration privileges could crash an affected Linux system by creating certain traffic-control rules.
- Exploitation
- Local Privilege
- Attacker needs
- High Privilege
- Complexity
- Moderate
- Impact
- Denial Of Service
- Component
- OS kernel
- Class
- Denial of service
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
This vulnerability is a Linux kernel denial-of-service flaw in the traffic control classifier subsystem, specifically the cls_fw firewall-mark classifier used by net/sched. Under a race/ordering condition, an invalid old-style cls_fw filter can be published to a shared traffic-control block before its change/validation routine completes. Packets may then be classified through this partially initialized or invalid filter, causing fw_classify() to hit a WARN_ON() and then dereference a NULL pointer. The result is a kernel oops or crash, and on systems configured to panic on oops, a full system reboot or outage. Exploitation generally requires the ability to create or modify traffic-control filters, typically root or CAP_NET_ADMIN privileges, although container or namespace configurations that grant network administration capabilities can increase practical exposure.
Why it matters to the business
Successful exploitation can crash affected Linux systems or interrupt networking workloads that depend on them. The primary consequence is availability loss: servers, network appliances, container hosts, or virtualized workloads may reboot, hang, or lose service depending on kernel configuration and workload placement. Because exploitation requires local network-administration privileges and there is no known public exploit maturity or KEV listing, broad internet-scale exploitation is unlikely, but environments that delegate CAP_NET_ADMIN to containers, automation jobs, or less-trusted users should treat this as higher priority.
How an attack unfolds
An attacker with sufficient local privileges first obtains the ability to manipulate Linux traffic-control configuration, such as root access or CAP_NET_ADMIN in a relevant network namespace. They create or use a network interface and attach a clsact qdisc or shared traffic-control block. They then add filters in a sequence that causes an old-style cls_fw filter to be inserted into the shared block before validation rejects or destroys it. While that invalid filter exists briefly, the attacker generates traffic with packet marks that cause the classifier path to evaluate the invalid filter. The kernel enters fw_classify(), reaches the inconsistent state, and dereferences a NULL pointer. Depending on kernel configuration, this produces a kernel warning, oops, networking disruption, or system panic/reboot.
How to fix it
Apply the vendor-provided Linux kernel update that includes the upstream fix for net/sched cls_fw handling of old-style classification on shared blocks. Where fixed package versions are not listed, use the latest stable kernel from the operating-system vendor or distribution security channel and confirm that the patch titled similar to "net/sched: cls_fw: fix NULL dereference of old filters before change()" is included. Reboot into the fixed kernel after installation. As interim mitigation, restrict CAP_NET_ADMIN to trusted users and workloads, avoid granting privileged or network-admin capabilities to containers unless required, disable unprivileged user namespaces where appropriate, and remove or blacklist the cls_fw module if firewall-mark traffic-control classification is not used. Review automation that creates tc qdisc/filter objects and remove unsupported old-style cls_fw usage.
How to confirm the fix worked
Confirm the running kernel is updated, not just installed, by checking the active kernel version after reboot and comparing it with the vendor advisory or changelog containing the cls_fw fix. Verify whether cls_fw is present or loaded with tools such as lsmod, modinfo, or distribution package metadata. Inspect traffic-control configuration with tc qdisc show and tc filter show to identify clsact qdiscs, shared blocks, and fw filters. Validate mitigation by confirming untrusted users and containers do not have CAP_NET_ADMIN and cannot run tc filter add operations. Review kernel logs after testing or normal operation to ensure there are no new fw_classify(), cls_fw, NULL pointer dereference, or include/net/pkt_cls.h warnings.
Typical attack path
- Gain local access with root privileges, CAP_NET_ADMIN, or equivalent ability to configure Linux traffic control.
- Create or select a network interface where traffic-control filters can be attached.
- Attach a clsact qdisc or shared traffic-control block to the interface.
- Add traffic-control filters including a matchall action that sets a packet mark and an old-style cls_fw filter.
- Generate a high volume of matching packets while the invalid filter is briefly visible to the datapath.
- Trigger fw_classify() to process the invalid filter and dereference a NULL pointer.
- Cause a kernel oops, panic, reboot, or network-service interruption.
How to detect it
Look for evidence in kernel logs, system journals, audit logs, shell history, EDR telemetry, and container runtime logs. Key artifacts include kernel warnings or oopses referencing fw_classify, cls_fw, include/net/pkt_cls.h, tcf_classify, tc_run, __dev_queue_xmit, or a NULL pointer dereference near address 0000000000000038. Correlate those events with recent execution of tc commands that add qdiscs, shared blocks, or fw filters, especially commands using "tc qdisc add ... clsact", "tc filter add block", "matchall", "skbedit mark", or "prio ... fw". Also review process execution for packet generators or high-rate local traffic tools launched immediately before the crash. In containerized environments, check whether a container with CAP_NET_ADMIN executed tc or generated traffic shortly before the host kernel warning, oops, panic, or reboot. Because this flaw primarily causes denial of service and does not create a stable persistent artifact, detection should focus on crash telemetry and pre-crash command/activity correlation.
- fw_classify
- cls_fw
- include/net/pkt_cls.h:88
- BUG: kernel NULL pointer dereference, address: 0000000000000038
- WARNING: ./include/net/pkt_cls.h:88
- tcf_classify
- tc_run
- __dev_queue_xmit
- tc qdisc add dev
- egress_block
- clsact
- tc filter add block
- matchall action skbedit mark
- tc filter add block 1 protocol ip prio 2 fw
- skbedit mark 65536
- RIP: 0010:fw_classify
- Modules linked in: cls_fw
- old-style classification on shared blocks
What your security team should do
- Prioritize patching Linux systems that grant CAP_NET_ADMIN to containers, network automation, CI jobs, tenants, or non-administrative operators.
- Update to a vendor-supported kernel containing the cls_fw net/sched fix and reboot into the patched kernel.
- Inventory hosts using Linux traffic control, clsact qdiscs, shared tc blocks, or cls_fw filters.
- Remove CAP_NET_ADMIN from containers and service accounts unless explicitly required.
- Disable or blacklist cls_fw where it is not operationally needed, after confirming no traffic-shaping or classification dependency exists.
- Monitor kernel logs for fw_classify, cls_fw, pkt_cls.h warnings, kernel oopses, and unexpected reboots.
- Review audit, shell, and EDR telemetry for suspicious tc qdisc or tc filter commands executed shortly before crashes.
- Treat repeated kernel oopses or reboots following tc filter activity as potential exploitation or unsafe automation until proven otherwise.
The record
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---
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|