CVE-2023-53620CVE-2023-53620是Linux内核中md(Multiple Devices,多重设备)子系统的一个软死锁(soft lockup)漏洞。该漏洞位于md模块的status_resync()函数中。在Linux内核的RAID管理中,md模块负责管理软件RAID阵列,而status_resync()函数用于向用户展示RAID阵列的同步进度信息。
该漏洞的根本原因在于status_resync()函数在计算'curr_resync - recovery_active'时存在整数溢出风险。由于curr_resync和recovery_active这两个变量在md_do_sync()函数中被并发更新,status_resync()函数在读取它们时存在竞态条件。当发生整数溢出时,计算结果可能变成一个巨大的数值,导致status_resync()函数陷入一个长时间运行的循环中,不断打印大量的'='字符来绘制进度条。这种长时间的循环会导致CPU占用过高,触发内核的软死锁检测机制,从而使系统响应变得极其缓慢甚至无响应。
该漏洞的CVSS评分为5.5,属于中等严重等级。其攻击向量为本地攻击(AV:L),需要低权限(PR:L),无需用户交互(UI:N),对机密性和完整性无影响,但会导致高可用性影响(A:H)。该漏洞主要影响运行Linux内核的服务器和工作站系统,尤其是使用软件RAID阵列的环境。
从技术层面分析,该漏洞涉及Linux内核md子系统的并发同步问题。
漏洞原理:
1. 在md_do_sync()函数执行RAID同步操作时,会持续更新两个关键变量:curr_resync(当前已同步的扇区数)和recovery_active(恢复操作的偏移量)。
2. status_resync()函数负责生成类似'[============>........] resync = 61.4%'这样的进度条信息,它通过计算'curr_resync - recovery_active'来确定已完成的同步进度。
3. 由于status_resync()和md_do_sync()之间缺少适当的同步机制(如锁或内存屏障),status_resync()可能在curr_resync和recovery_active不一致的状态下读取这两个值。
4. 当recovery_active的值大于curr_resync时(例如在恢复操作刚刚启动或状态切换的瞬间),'curr_resync - recovery_active'会下溢为类型所能表示的最大正数(整数环绕)。
5. 这个巨大的数值被用作循环计数器,导致status_resync()进入一个几乎无限循环,持续打印'='字符,最终触发软死锁。
利用方式:
该漏洞的利用需要本地访问权限。攻击者需要:
1. 拥有系统的低权限账户访问权限;
2. 能够访问或触发md设备的同步状态查询,例如通过读取/proc/mdstat文件或使用mdadm工具查看RAID状态;
3. 在特定的时序条件下(recovery_active被更新但curr_resync尚未更新时)触发status_resync()的执行。
虽然该漏洞不直接提供权限提升或代码执行能力,但它可以导致系统拒绝服务(DoS),使受影响的系统陷入软死锁状态。