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

CVE-2023-53671 Linux内核SRCU模块启动CPU假设缺陷导致系统挂起

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

漏洞信息

漏洞编号
CVE-2023-53671
漏洞类型
拒绝服务(系统挂起)
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux KernelSRCU拒绝服务系统挂起本地提权内核漏洞PowerPCkdumpfsnotify可用性影响

漏洞概述

CVE-2023-53671是Linux内核中SRCU(Sleepable Read-Copy-Update,可睡眠读拷贝更新)模块的一个高可用性影响漏洞。该漏洞源于内核提交994f706872e6("srcu: Make Tree SRCU able to operate without snp_node array"),该提交错误地假设CPU 0在系统运行期间始终处于在线状态。然而,在实际应用场景中,存在CPU 0不在线而其他CPU作为引导CPU的情况,例如使用maxcpus=1引导参数启动kdump内核时。

当该缺陷被触发时,系统会出现严重挂起现象。从漏洞描述中的内核日志可以看到,systemd进程(PID 1)和kworker/u16:1工作线程均被阻塞超过122秒,调用栈显示它们在等待fsnotify相关的资源销毁操作完成。具体而言,fsnotify_mark_destroy_workfn工作队列在执行fsnotify_wait_marks_destroyed时无限等待,导致整个系统进入不可用状态。该漏洞主要影响PowerPC架构平台,因为PowerPC上的kdump内核更容易出现非CPU 0作为引导CPU的情况。

该漏洞的CVSS 3.1评分为5.5分,属于中等严重级别。虽然攻击需要本地低权限触发且无需用户交互,但其对系统可用性造成的影响为高(Availability: High),可能导致系统完全挂起,需要强制重启才能恢复。该问题已在Linux内核稳定版中通过多个提交修复,包括2c4d26dad76e、7f24626d6dd8和c7c0bc03fa44等补丁。

技术细节

从技术层面分析,该漏洞的根本原因在于SRCU树形实现中对引导CPU的错误假设。在Linux内核的SRCU子系统中,当使用SRCU_SIZE_SMALL配置时,相关工作会被委托给一个特定的CPU执行。原提交994f706872e6在重构Tree SRCU使其能够在没有snp_node数组的情况下运行时,隐式地假设了CPU 0始终在线,因此将相关工作硬编码到CPU 0上执行。

然而,在以下场景中CPU 0可能不在线:
1. 使用maxcpus=1引导参数启动kdump内核时,内核可能选择非0号CPU作为引导CPU;
2. 在多CPU系统中,如果CPU 0被配置为离线状态,系统会选择其他CPU作为引导CPU。

当引导CPU不是CPU 0时,SRCU模块尝试将工作委托给不在线的CPU 0,导致工作永远无法被执行。这会引发连锁反应:fsnotify子系统中的标记销毁工作无法完成,进而导致inotify_release、fsnotify_destroy_group等关键清理操作永久阻塞,最终使整个系统陷入挂起状态。

修复方案是修改SRCU模块,使其将工作正确地委托给实际的引导CPU(boot CPU),而非硬编码的CPU 0。这一修改通过获取当前在线的引导CPU ID来实现,确保无论哪个CPU作为引导CPU,SRCU的清理工作都能被正确调度和执行。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要在受影响的Linux内核系统上获得本地低权限访问权限,并确保系统运行在存在CPU编号偏移的环境中(如PowerPC架构或使用特定引导参数的系统)
STEP 2
步骤2:触发非标准引导CPU场景
通过kdump机制或修改引导参数(如maxcpus=1),使系统在引导时选择非CPU 0作为引导CPU,触发SRCU模块中错误的CPU 0假设
STEP 3
步骤3:SRCU工作委托失败
SRCU模块尝试将清理工作委托给硬编码的CPU 0,但由于CPU 0处于离线状态,工作永远无法被执行
STEP 4
步骤4:关键资源清理阻塞
fsnotify子系统中的标记销毁工作无法完成,导致inotify_release、fsnotify_destroy_group等清理操作永久阻塞
STEP 5
步骤5:系统完全挂起
systemd进程和关键工作线程被阻塞超过122秒,系统进入不可用状态,必须通过硬重启或SysRq等强制手段恢复

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC: Trigger CVE-2023-53671 by booting a kdump kernel with maxcpus=1 on PowerPC // This causes a non-zero CPU to be the boot CPU, triggering the SRCU hang // Step 1: Configure kdump on a PowerPC system // Ensure kdump is enabled in the system: echo "1" > /proc/sys/kernel/kexec_load_disabled // Step 2: Load a kdump kernel with maxcpus=1 parameter // This forces the kdump kernel to boot with only 1 CPU, // and on PowerPC, this CPU may not be CPU 0 kexec -p /boot/vmlinuz-kdump \ --initrd=/boot/initramfs-kdump.img \ --append="maxcpus=1 irqpoll nr_cpus=1 reset_devices" // Step 3: Trigger the crash to boot into kdump kernel echo c > /proc/sysrq-trigger // Step 4: Observe the system hang // After booting into kdump kernel, the system will hang // because SRCU tries to delegate work to CPU 0 which is offline // Check kernel logs for: // "INFO: task systemd:1 blocked for more than 122 seconds." // "INFO: task kworker/u16:1:24 blocked for more than 122 seconds." // Verification command to check if the system is hung: dmesg | grep -i "blocked for more than" // Expected output showing the hang: // [ 243.686240] INFO: task systemd:1 blocked for more than 122 seconds. // [ 243.686708] INFO: task kworker/u16:1:24 blocked for more than 122 seconds.

影响范围

Linux Kernel < 6.1(受commit 994f706872e6影响的版本)
Linux Kernel 6.1.0-rc1(漏洞报告中确认受影响的版本)
Linux Kernel 6.0.x系列
Linux Kernel 5.19.x系列
Linux Kernel 5.15.x LTS系列

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1)避免在PowerPC等可能存在非0号CPU作为引导CPU的架构上使用maxcpus=1等限制CPU数量的引导参数;2)确保kdump内核的引导参数中正确配置nr_cpus参数,使引导CPU为CPU 0;3)在系统监控中增加对hung_task的检测,及时发现并处理系统挂起情况;4)配置hung_task_timeout_secs为合理值以便及时获取诊断信息;5)如系统出现挂起,可通过SysRq组合键尝试恢复或执行硬重启。

参考链接

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