CVE-2026-64012
NoneCVSS
—
EPSS
0.1%
Published
Jul 19, 2026
CISA due date
—
Cloudanix analysis
A flaw in Linux network traffic shaping can let someone with network administration privileges crash a system by using a specific traffic-control setup.
- 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
- Medium
What it actually does
This Linux kernel flaw is a denial-of-service bug in the traffic control scheduler path, specifically involving the sch_sfb queuing discipline when it has child qdiscs such as sch_qfq and is itself used under a parent qdisc such as sch_tbf. The vulnerable path incorrectly calls a child dequeue operation after a prior peek operation, rather than consuming the skb that was already peeked. With certain nested qdisc combinations, this can leave the child scheduler state inconsistent and cause a NULL pointer dereference in qfq_dequeue(), resulting in a kernel panic or networking subsystem crash. Practical exploitation generally requires the ability to configure Linux traffic control qdiscs, typically CAP_NET_ADMIN or equivalent privileges, although systems that already expose the vulnerable qdisc hierarchy could potentially be crashed by traffic that exercises the path.
Why it matters to the business
Successful exploitation can crash affected Linux systems, interrupting workloads, network appliances, container hosts, routers, firewalls, load balancers, or other services that rely on kernel traffic shaping. Because exploitation is primarily a denial-of-service condition and no public exploitation is indicated by the provided data, the immediate risk is lower than remote code execution; however, the operational impact can still be significant for systems where traffic control is used in production. EPSS is low and the issue is not listed in CISA KEV, so prioritize patching based on exposure: highest for multi-tenant Linux hosts, systems allowing untrusted users network namespace or traffic-control privileges, and infrastructure using advanced qdisc configurations.
How an attack unfolds
An attacker first needs a way to influence Linux traffic control configuration or to operate inside an environment where vulnerable qdisc nesting is already present. They configure, or take advantage of, a scheduler hierarchy where a parent qdisc requests packets from sch_sfb, and sch_sfb has a child qdisc such as sch_qfq whose peek callback uses qdisc_peek_dequeued(). The parent performs a peek and sees an skb available from the child path. The vulnerable sch_sfb code then performs a direct child dequeue instead of using qdisc_dequeue_peeked() to consume the already-peeked skb. Under the right packet flow, particularly involving GSO skb handling, this mismatch causes qfq_dequeue() to operate on unexpected state and dereference a NULL pointer. The result is a kernel oops or panic, taking down the host or disrupting network service.
How to fix it
Upgrade to a Linux kernel version that includes the fix changing sch_sfb to use qdisc_dequeue_peeked() after peeked packets rather than directly calling the child dequeue path. No exact fixed package versions were provided, so obtain patched kernels from the relevant Linux distribution, vendor advisory, or upstream stable kernel channel once available. As mitigations until patching is complete, avoid using vulnerable nested qdisc combinations involving sch_sfb with child qdiscs such as sch_qfq, remove unnecessary sfb/qfq/tbf traffic-control configurations, restrict CAP_NET_ADMIN to trusted users and containers only, disable unprivileged user namespaces where they may allow users to gain network namespace control, and prevent privileged container workloads from modifying host or namespace traffic control settings unless required.
How to confirm the fix worked
Confirm the running kernel includes the upstream fix for sch_sfb dequeue handling or a vendor backport of that fix. Inventory loaded traffic-control modules and active qdisc hierarchies using commands such as `tc qdisc show`, `lsmod | grep -E 'sch_sfb|sch_qfq|sch_tbf'`, and distribution package tooling to verify the installed kernel package version. Validate that untrusted users and containers cannot obtain CAP_NET_ADMIN or alter qdisc configuration. After remediation, exercise representative traffic-shaping workloads and confirm there are no kernel oops, KASAN, NULL pointer dereference, or qfq_dequeue/sfb_dequeue crash messages in kernel logs.
Typical attack path
- Obtain CAP_NET_ADMIN, root privileges, or equivalent control over network traffic control configuration, including through a privileged container or network namespace if permitted.
- Create or identify a nested qdisc hierarchy involving sch_sfb with a child qdisc such as sch_qfq and a parent qdisc such as sch_tbf.
- Generate packet traffic through the affected interface so the parent qdisc performs a peek followed by a dequeue through sch_sfb into the child qdisc.
- Trigger the vulnerable mismatch where sch_sfb directly dequeues from the child instead of consuming the previously peeked skb.
- Cause a NULL pointer dereference in the kernel scheduler path, producing a kernel oops, panic, or system/network-service outage.
How to detect it
To determine whether this was already exploited or triggered, review kernel logs, persistent journal entries, crash dumps, and monitoring alerts for kernel oops or panic events involving the traffic control scheduler. Key log sources include `dmesg`, `/var/log/kern.log`, `/var/log/messages`, `journalctl -k`, kdump/vmcore artifacts, hypervisor reset records, and endpoint telemetry showing unexpected reboots. Look for stack traces containing `qfq_dequeue`, `sfb_dequeue`, `tbf_dequeue`, `__qdisc_run`, `qdisc_peek_dequeued`, or NULL pointer dereference/KASAN messages. Also review shell history, audit logs, sudo logs, container runtime logs, and EDR telemetry for suspicious or unexpected use of `tc qdisc` commands creating `sfb`, `qfq`, or `tbf` qdisc hierarchies. Exploitation may leave no file-based artifact beyond command history, audit records, crash dumps, and kernel logs.
- KASAN: null-ptr-deref
- null-ptr-deref in range [0x0000000000000048-0x000000000000004f]
- RIP: 0010:qfq_dequeue
- qfq_dequeue+
- sfb_dequeue+
- tbf_dequeue+
- __qdisc_run+
- qdisc_peek_dequeued+
- Comm: ping
- sch_qfq
- sch_sfb
- sch_tbf
- tc qdisc add
- tc qdisc replace
- tc qdisc change
- tc qdisc add dev
- tc qdisc replace dev
- tc qdisc change dev
- qdisc sfb
- qdisc qfq
- qdisc tbf
- kind sfb
- kind qfq
- kind tbf
What your security team should do
- Identify Linux systems using traffic control, especially hosts with sch_sfb, sch_qfq, or sch_tbf loaded or configured.
- Prioritize patching for network infrastructure, container platforms, multi-tenant systems, and hosts where users or workloads may have CAP_NET_ADMIN.
- Review container and namespace policies to ensure untrusted workloads cannot configure qdiscs or retain unnecessary network administration capabilities.
- Temporarily remove or redesign nested qdisc configurations involving sch_sfb and sch_qfq where feasible until patched kernels are deployed.
- Monitor kernel logs for qfq_dequeue, sfb_dequeue, tbf_dequeue, NULL pointer dereference, KASAN, oops, or panic events.
- Track vendor kernel advisories because no exact fixed versions were provided in the input, and ensure backported fixes are applied even if kernel version numbers differ from upstream.
The record
In the Linux kernel, the following vulnerability has been resolved: net/sched: sch_sfb: Replace direct dequeue call with peek and qdisc_dequeue_peeked When sfb 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 (sfb 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(sfb) 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 (sfb). And herein lies the problem. - sfb will call the child's dequeue() which will essentially just try to grab something of qfq's queue. [ 127.594489][ T453] KASAN: null-ptr-deref in range [0x0000000000000048-0x000000000000004f] [ 127.594741][ T453] CPU: 2 UID: 0 PID: 453 Comm: ping Not tainted 7.1.0-rc1-00035-gac961974495b-dirty #793 PREEMPT(full) [ 127.595059][ T453] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 [ 127.595254][ T453] RIP: 0010:qfq_dequeue+0x35c/0x1650 [sch_qfq] [ 127.595461][ T453] Code: 00 fc ff df 80 3c 02 00 0f 85 17 0e 00 00 4c 8d 73 48 48 89 9d b8 02 00 00 48 b8 00 00 00 00 00 fc ff df 4c 89 f2 48 c1 ea 03 <80> 3c 02 00 0f 85 76 0c 00 00 48 b8 00 00 00 00 00 fc ff df 4c 8b [ 127.596081][ T453] RSP: 0018:ffff88810e5af440 EFLAGS: 00010216 [ 127.596337][ T453] RAX: dffffc0000000000 RBX: 0000000000000000 RCX: dffffc0000000000 [ 127.596623][ T453] RDX: 0000000000000009 RSI: 0000001880000000 RDI: ffff888104fd82b0 [ 127.596917][ T453] RBP: ffff888104fd8000 R08: ffff888104fd8280 R09: 1ffff110211893a3 [ 127.597165][ T453] R10: 1ffff110211893a6 R11: 1ffff110211893a7 R12: 0000001880000000 [ 127.597404][ T453] R13: ffff888104fd82b8 R14: 0000000000000048 R15: 0000000040000000 [ 127.597644][ T453] FS: 00007fc380cbfc40(0000) GS:ffff88816f2a8000(0000) knlGS:0000000000000000 [ 127.597956][ T453] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 127.598160][ T453] CR2: 00005610aa9890a8 CR3: 000000010369e000 CR4: 0000000000750ef0 [ 127.598390][ T453] PKRU: 55555554 [ 127.598509][ T453] Call Trace: [ 127.598629][ T453] <TASK> [ 127.598718][ T453] ? mark_held_locks+0x40/0x70 [ 127.598890][ T453] ? srso_alias_return_thunk+0x5/0xfbef5 [ 127.599053][ T453] sfb_dequeue+0x88/0x4d0 [ 127.599174][ T453] ? ktime_get+0x137/0x230 [ 127.599328][ T453] ? srso_alias_return_thunk+0x5/0xfbef5 [ 127.599480][ T453] ? qdisc_peek_dequeued+0x7b/0x350 [sch_qfq] [ 127.599670][ T453] ? srso_alias_return_thunk+0x5/0xfbef5 [ 127.599831][ T453] tbf_dequeue+0x6b1/0x1098 [sch_tbf] [ 127.599988][ T453] __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 |
|---|