CVE-2026-43496
Medium · 5.5CVSS
5.5
EPSS
0.2%
Published
May 21, 2026
CISA due date
—
Cloudanix analysis
A person with local network-administration privileges could crash an affected Linux system by using a specific traffic-shaping setup.
- Exploitation
- Local Privilege
- Attacker needs
- Low Privilege
- Complexity
- Low
- Impact
- Denial Of Service
- Component
- OS kernel
- Class
- Denial of service
- Remediation
- Patch
- Effort
- Low
- Patch risk
- Low
What it actually does
This flaw is a local availability vulnerability in the Linux kernel traffic-control scheduler path. When a RED qdisc has a child qdisc such as QFQ whose peek callback uses qdisc_peek_dequeued(), a parent qdisc such as TBF can first peek an skb and then cause RED to call the child qdisc's direct dequeue path instead of consuming the already-peeked skb. That inconsistent peek/dequeue sequence can leave the child state invalid and trigger a NULL pointer dereference in qfq_dequeue(), resulting in a kernel panic. The practical impact is denial of service of the affected host; confidentiality and integrity are not directly affected.
Why it matters to the business
An attacker with local access and sufficient network-administration capability, or the ability to abuse an already vulnerable traffic-control configuration, can crash affected Linux systems. This can interrupt applications, network services, container hosts, appliances, and workloads that rely on kernel traffic shaping. The issue is not listed in CISA KEV, has low EPSS, and has no reported mature public exploit in the provided data, so broad internet-scale exploitation is unlikely; however, systems that delegate CAP_NET_ADMIN or allow tenants/containers to configure qdiscs have higher operational risk.
How an attack unfolds
An attacker first obtains local execution on a Linux system or in a context that can influence kernel traffic-control configuration, typically requiring CAP_NET_ADMIN in the relevant network namespace. The attacker configures or abuses a nested qdisc hierarchy where a parent qdisc such as TBF interacts with RED, and RED has a child qdisc such as QFQ that supports the problematic peek behavior. The attacker then generates traffic that causes the parent scheduler to peek an skb from the child path and subsequently dequeue through RED. On vulnerable kernels, RED directly calls the child dequeue operation instead of qdisc_dequeue_peeked(), so the previously peeked packet state is not handled correctly. This can drive qfq_dequeue() into a NULL pointer dereference and panic the kernel, taking the host or network namespace-dependent workload offline.
How to fix it
Upgrade to a kernel package from the operating-system or appliance vendor that includes the upstream fix changing sch_red to use qdisc_dequeue_peeked() after peeked packets. Because no exact fixed versions were provided, use the vendor advisory or kernel changelog for CVE-2026-43496 and confirm the fix is present in the running kernel, not only installed on disk. If immediate patching is not possible, reduce exposure by removing vulnerable qdisc combinations, avoiding RED with QFQ children under parent qdiscs such as TBF, disabling or unloading unused sch_red/sch_qfq/sch_tbf modules where feasible, restricting CAP_NET_ADMIN from containers and untrusted users, limiting use of unprivileged network namespaces according to operational requirements, and monitoring or blocking unauthorized tc qdisc changes.
How to confirm the fix worked
Confirm the running kernel is a vendor-fixed build using uname -a, package-manager metadata, and the vendor security advisory. If building from source, verify net/sched/sch_red.c contains the corrected logic that consumes peeked packets via qdisc_dequeue_peeked() rather than directly calling the child dequeue path after a peek. Check whether relevant modules are present or loaded with lsmod, modinfo, and kernel configuration. Review traffic-control state with tc -s qdisc show to determine whether RED, QFQ, or TBF qdiscs are in use. In a non-production test system, reproduce the previously vulnerable qdisc hierarchy and traffic pattern and confirm it no longer panics. After patching, reboot or otherwise ensure the fixed kernel is actually running.
Typical attack path
- Gain local code execution on the target system, container host, appliance, or workload environment.
- Obtain or abuse CAP_NET_ADMIN, root privileges, or an existing traffic-control configuration in the relevant network namespace.
- Create or identify a nested qdisc hierarchy involving RED with a child qdisc such as QFQ, commonly under a parent scheduler such as TBF.
- Generate network traffic that causes the parent qdisc to peek and then dequeue through the RED/QFQ path.
- Trigger the invalid dequeue sequence and NULL pointer dereference in the kernel scheduler code.
- Cause a kernel panic, service outage, reboot, or crash dump generation.
How to detect it
To determine whether this was already exploited, examine kernel logs and crash artifacts for panics or NULL pointer dereferences involving qfq_dequeue, red_dequeue, tbf_dequeue, sch_qfq, sch_red, or __qdisc_run. Relevant sources include journalctl -k, dmesg, /var/log/kern.log, /var/log/messages, syslog, pstore/ramoops, kdump vmcores, hypervisor reset events, and system availability monitoring around unexpected reboots. Review auditd, process accounting, shell history where appropriate, and EDR telemetry for tc qdisc commands or netlink qdisc modification events shortly before the crash. Look for creation of nested qdisc configurations containing red, qfq, and tbf. In containerized environments, review container runtime and orchestration logs for workloads granted CAP_NET_ADMIN or privileged mode before the event. Absence of these artifacts does not prove non-exploitation because a kernel panic may truncate logs unless persistent crash logging is enabled.
- KASAN: null-ptr-deref in range [0x0000000000000048-0x000000000000004f]
- qfq_dequeue+
- red_dequeue+
- tbf_dequeue
- __qdisc_run
- [sch_qfq]
- [sch_red]
- [sch_tbf]
- RIP: 0010:qfq_dequeue
- BUG: kernel NULL pointer dereference
- kernel panic
- tc qdisc add
- tc qdisc replace
- qdisc red
- qdisc qfq
- qdisc tbf
- RTM_NEWQDISC
- RTM_DELQDISC
- CAP_NET_ADMIN
What your security team should do
- Prioritize patching Linux systems that allow local users, containers, orchestration components, or tenants to use CAP_NET_ADMIN or configure traffic control.
- Inventory systems using RED, QFQ, or TBF qdiscs with tc -s qdisc show and focus validation on those hosts first.
- Remove CAP_NET_ADMIN from containers and service accounts unless explicitly required.
- Alert on unexpected executions of tc, ip, or other netlink-based network configuration tools by non-administrative users.
- Review audit logs for recent qdisc modifications, especially RTM_NEWQDISC activity or tc commands creating red, qfq, or tbf schedulers.
- Enable or verify crash capture such as kdump, pstore, or ramoops on high-value Linux systems to preserve evidence after kernel panics.
- If patching is delayed, replace affected qdisc hierarchies with non-vulnerable traffic-shaping configurations or disable the relevant scheduler modules where operationally safe.
The record
In the Linux kernel, the following vulnerability has been resolved: net/sched: sch_red: Replace direct dequeue call with peek and qdisc_dequeue_peeked When red qdisc has children (eg qfq qdisc) whose peek() callback is qdisc_peek_dequeued(), we could get a kernel panic. When the parent of such qdiscs (eg illustrated in patch #3 as tbf) wants to retrieve an skb from its child (red in this case), it will do the following: 1a. do a peek() - and when sensing there's an skb the child can offer, then - the child in this case(red) calls its child's (qfq) peek. qfq does the right thing and will return the gso_skb queue packet. Note: if there wasnt a gso_skb entry then qfq will store it there. 1b. invoke a dequeue() on the child (red). And herein lies the problem. - red will call the child's dequeue() which will essentially just try to grab something of qfq's queue. [ 78.667668][ T363] KASAN: null-ptr-deref in range [0x0000000000000048-0x000000000000004f] [ 78.667927][ T363] CPU: 1 UID: 0 PID: 363 Comm: ping Not tainted 7.1.0-rc1-00033-g46f74a3f7d57-dirty #790 PREEMPT(full) [ 78.668263][ T363] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 [ 78.668486][ T363] RIP: 0010:qfq_dequeue+0x446/0xc90 [sch_qfq] [ 78.668718][ T363] Code: 54 c0 e8 dd 90 00 f1 48 c7 c7 e0 03 54 c0 48 89 de e8 ce 90 00 f1 48 8d 7b 48 b8 ff ff 37 00 48 89 fa 48 c1 e0 2a 48 c1 ea 03 <80> 3c 02 00 74 05 e8 ef a1 e1 f1 48 8b 7b 48 48 8d 54 24 58 48 8d [ 78.669312][ T363] RSP: 0018:ffff88810de573e0 EFLAGS: 00010216 [ 78.669533][ T363] RAX: dffffc0000000000 RBX: 0000000000000000 RCX: 0000000000000000 [ 78.669790][ T363] RDX: 0000000000000009 RSI: 0000000000000004 RDI: 0000000000000048 [ 78.670044][ T363] RBP: ffff888110dc4000 R08: ffffffffb1b0885a R09: fffffbfff6ba9078 [ 78.670297][ T363] R10: 0000000000000003 R11: ffff888110e31c80 R12: 0000001880000000 [ 78.670560][ T363] R13: ffff888110dc4150 R14: ffff888110dc42b8 R15: 0000000000000200 [ 78.670814][ T363] FS: 00007f66a8f09c40(0000) GS:ffff888163428000(0000) knlGS:0000000000000000 [ 78.671110][ T363] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 78.671324][ T363] CR2: 000055db4c6a30a8 CR3: 000000010da67000 CR4: 0000000000750ef0 [ 78.671585][ T363] PKRU: 55555554 [ 78.671713][ T363] Call Trace: [ 78.671843][ T363] <TASK> [ 78.671936][ T363] ? __pfx_qfq_dequeue+0x10/0x10 [sch_qfq] [ 78.672148][ T363] ? __pfx__printk+0x10/0x10 [ 78.672322][ T363] ? srso_alias_return_thunk+0x5/0xfbef5 [ 78.672496][ T363] ? lockdep_hardirqs_on_prepare+0xa8/0x1a0 [ 78.672706][ T363] ? srso_alias_return_thunk+0x5/0xfbef5 [ 78.672875][ T363] ? trace_hardirqs_on+0x19/0x1a0 [ 78.673047][ T363] red_dequeue+0x65/0x270 [sch_red] [ 78.673217][ T363] ? srso_alias_return_thunk+0x5/0xfbef5 [ 78.673385][ T363] tbf_dequeue.cold+0xb0/0x70c [sch_tbf] [ 78.673566][ T363] __qdisc_run+0x169/0x1900 The right thing to do in #1b is to grab the skb off gso_skb queue. This patchset fixes that issue by changing #1b to use qdisc_dequeue_peeked() method instead.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| openSUSE:Tumbleweed | kernel-source | 0 | 7.0.10-1.1 |
Related vulnerabilities
- CVE-2026-53354 In the Linux kernel, the following vulnerability has been resolved: arm64: errata… Also affects kernel-source
- CVE-2026-53325 In the Linux kernel, the following vulnerability has been resolved: agp/amd64: Fix broken… Also affects kernel-source
- CVE-2026-52946 In the Linux kernel, the following vulnerability has been resolved: fs/fcntl: fix… Also affects kernel-source
- CVE-2026-52907 In the Linux kernel, the following vulnerability has been resolved: media: rockchip… Also affects kernel-source
- CVE-2026-52906 In the Linux kernel, the following vulnerability has been resolved: 9p: fix access mode… Also affects kernel-source
- CVE-2026-52905 In the Linux kernel, the following vulnerability has been resolved: mm/damon/core… Also affects kernel-source
- CVE-2026-52904 In the Linux kernel, the following vulnerability has been resolved: drm/nouveau: fix… Also affects kernel-source
- CVE-2026-46332 In the Linux kernel, the following vulnerability has been resolved: greybus… Also affects kernel-source