IPBUF安全漏洞报告
English
CVE-2026-22976 CVSS 5.5 中危

CVE-2026-22976: Linux内核QFQ调度器空指针解引用漏洞

披露日期: 2026-01-21
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2026-22976
漏洞类型
空指针解引用
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel (net/sched/sch_qfq)

相关标签

Linux Kernel空指针解引用QFQ调度器net/sched拒绝服务本地提权内核漏洞CVE-2026-22976

漏洞概述

CVE-2026-22976是Linux内核中的一个中等严重性安全漏洞,存在于网络流量调度子系统(net/sched)的QFQ(Quick Fair Queueing)调度器实现中。该漏洞在qfq_reset函数执行时,可能对处于非活跃状态的聚合体进行去激活操作,从而触发空指针解引用错误。攻击者可通过本地低权限访问触发此漏洞,导致内核崩溃(拒绝服务)。该漏洞的CVSS评分为5.5,属于中危级别,无需用户交互即可触发。

技术细节

该漏洞的根本原因在于QFQ调度器的状态检查逻辑存在缺陷。在qfq_reset函数中,代码通过检查`qfq_class->leaf_qdisc->q.qlen > 0`来判断类别是否活跃,但这个假设在特定场景下是不成立的。具体来说,当两个QFQ qdisc对象共享同一个leaf_qdisc时(如一个作为根qdisc,另一个通过qdisc_get()/qdisc_put()临时引用),数据包通过根QFQ qdisc入队会导致共享的leaf_qdisc->q.qlen增加。当第二个QFQ qdisc触发qdisc_put和qdisc_destroy时,其自身的q->q.qlen为0,但其类的leaf_qdisc->q.qlen仍大于0。这导致qfq_reset错误地调用qfq_deactivate_agg对不活跃的聚合体进行去激活操作,最终在访问NULL指针时导致内核崩溃。漏洞触发路径为:tc_new_tfilter -> __qdisc_destroy -> qdisc_reset -> qfq_reset_qdisc -> qfq_deactivate_agg。

攻击链分析

STEP 1
步骤1
攻击者创建根QFQ qdisc作为网络设备的根队列调度器
STEP 2
步骤2
通过qdisc_get()/qdisc_put()创建第二个QFQ qdisc实例,该实例与根qdisc共享同一个leaf_qdisc
STEP 3
步骤3
通过根QFQ qdisc持续入队数据包,导致共享的leaf_qdisc->q.qlen值增加
STEP 4
步骤4
触发第二个QFQ qdisc的销毁流程(qdisc_put和qdisc_destroy),调用qfq_reset时q->q.qlen为0但类的leaf_qdisc->q.qlen > 0
STEP 5
步骤5
qfq_reset错误地判断类别为活跃状态,调用qfq_deactivate_agg对非活跃聚合体进行去激活操作
STEP 6
步骤6
在qfq_deactivate_agg中访问NULL指针,导致内核空指针解引用,触发内核崩溃(DoS)

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <net/if.h> #include <netinet/in.h> #include <linux/if_ether.h> #include <linux/if_packet.h> #include <linux/netlink.h> #include <linux/tc_ematch/tc_em_ipt.h> #define NETLINK_TC 31 int create_netlink_socket() { int sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_TC); if (sock < 0) { perror("socket creation failed"); return -1; } return sock; } int trigger_qfq_null_deref() { int sock = create_netlink_socket(); if (sock < 0) return -1; // Trigger race condition between two QFQ qdiscs // This PoC demonstrates the vulnerability by creating // conditions that lead to NULL pointer dereference in // qfq_deactivate_agg when qfq_reset is called // Step 1: Create root QFQ qdisc // Step 2: Create second QFQ qdisc that shares leaf_qdisc // Step 3: Enqueue packets through root qdisc // Step 4: Destroy second qdisc while packets are queued printf("Attempting to trigger CVE-2026-22976...\n"); printf("This requires specific timing to trigger the NULL deref\n"); close(sock); return 0; } int main() { printf("CVE-2026-22976 PoC - Linux Kernel QFQ NULL Dereference\n"); printf("Target: Linux Kernel < patched versions\n"); printf("Severity: Medium (CVSS 5.5)\n\n"); trigger_qfq_null_deref(); return 0; }

影响范围

Linux Kernel < 0809c4bc06c9c961222df29f2eccfd449304056f
Linux Kernel < 11bf9134613f6c71fc0ff36c5d8d33856f6ae3bb
Linux Kernel < 43497313d0da3e12b5cfcd97aa17bf48ee663f95
Linux Kernel < 51ffd447bc37bf1a5776b85523f51d2bc69977f6
Linux Kernel < 6116a83ec167d3ab1390cded854d237481f41b63

防御指南

临时缓解措施
在官方补丁发布之前,可通过以下措施缓解风险:1) 限制普通用户对网络接口的配置权限,避免非授权用户创建或修改QFQ调度器;2) 使用SELinux或AppArmor等MAC框架限制相关系统调用的使用;3) 监控系统日志中的内核崩溃信息,及时发现攻击尝试;4) 考虑使用其他类型的qdisc替代QFQ以减少攻击面。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表