CVE-2023-53624CVE-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]区间内。