runc容器逃逸漏洞:通过procfs写入实现安全突破
漏洞概述
本文披露了三个高危runc容器逃逸漏洞(CVE-2025-31133、CVE-2025-52565和CVE-2025-52881),攻击者可通过不同的方法绕过runc对/proc文件写入的限制,实现完整的容器逃逸。
受影响版本
- CVE-2025-31133: 影响所有已知runc版本
- CVE-2025-52565: 影响runc >= 1.0.0-rc3的所有版本
- CVE-2025-52881: 影响所有已知runc版本
已发布修复版本
- runc v1.4.0-rc.3
- runc v1.3.3
- runc v1.2.8
强烈建议用户尽快更新到上述版本。
漏洞详细分析
CVE-2025-31133:通过"masked path"滥用实现容器逃逸
CVSS评分: 7.3
该漏洞利用runc中masked paths实现的缺陷。当屏蔽文件时,runc会将容器的/dev/null inode绑定挂载到文件顶部。但如果攻击者将/dev/null替换为指向其他procfs文件的符号链接,runc将改为以读写方式绑定挂载符号链接目标。
攻击方式:
- 攻击1:通过/proc/sys/kernel/core_pattern实现容器逃逸
- 攻击2:通过删除/dev/null使maskedPath操作失效
缓解措施:
- 使用用户命名空间
- 不在容器内以root用户运行
- 使用AppArmor阻止对maskedPaths的意外写入
CVE-2025-52565:恶意配置导致的容器逃逸
CVSS评分: 7.3
该漏洞利用/dev/console绑定挂载中的缺陷。当创建/dev/console绑定挂载时,如果攻击者将/dev/pts/$n替换为符号链接,runc将绑定挂载符号链接目标到/dev/console。
缓解措施:
- 使用用户命名空间
- 不在容器内以root用户运行
- SELinux默认策略可缓解此问题
CVE-2025-52881:任意写入gadgets和procfs写入重定向
CVSS评分: 7.3
这是CVE-2019-16884的更复杂变体,允许攻击者绕过LSM标签。攻击者可通过各种方法使/proc/self/attr/
缓解措施:
- 使用无根容器
- AppArmor和SELinux无法完全防护重定向写入攻击
其他容器运行时的影响
youki和crun存在类似漏洞,正在协调发布补丁。LXC也存在类似bug,但其安全策略认为非用户命名空间容器本质上不安全。
额外补丁说明
发布版本包含两个额外补丁,解决在预发布版本中发现的回归问题:
- openat2 EAGAIN重试失败:提高在繁忙系统上的恢复能力
- 悬挂符号链接挂载目标:重新允许挂载目标中存在悬挂符号链接
致谢
感谢以下研究人员发现和报告这些漏洞:
- Lei Wang (@ssst0n3 from Huawei)
- Li Fubang (@lifubang from acmcoder.com, CIIC)
- Tõnis Tiigi (@tonistiigi from Docker)
- Aleksa Sarai (@cyphar from SUSE)