CVE-2025-39953CVE-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释放路径中等待离线操作完成时的阻塞问题。