runc容器逃逸漏洞:技术概述
作者:Matteo Bisi, ReeVo公司DevSecOps团队负责人兼CNCF KCD组织者
本文涉及到的CNCF项目
2025年11月,runc中一组高危漏洞被公开披露,这些漏洞允许攻击者实现完整的容器逃逸。Runc是Linux上容器化的基石,是Docker、Podman和Kubernetes等行业标准工具默认的低层容器运行时。其普遍性意味着runc中的一个漏洞对整个云原生生态系统具有深远的影响。本文总结了这些漏洞、受影响的版本以及推荐的缓解措施。
漏洞详情
共发现三个漏洞,均与绕过runc对写入任意/proc文件的限制有关。这些漏洞可以通过使用自定义挂载配置(包括在Dockerfile中定义的RUN --mount=...)启动容器来利用。
- CVE-2025-31133:“通过‘掩码路径’滥用和挂载竞争条件实现容器逃逸”
- CVSS评分:7.3
- 描述:该漏洞利用了掩码路径实现方式的一个问题。攻击者可以将
/dev/null替换为指向procfs文件(例如/proc/sys/kernel/core_pattern或/proc/sysrq-trigger)的符号链接。然后runc会以读写方式绑定挂载该符号链接的目标,从而导致容器逃逸或主机崩溃。
- CVE-2025-52565:“因
/dev/console挂载及相关竞争条件,通过恶意配置实现容器逃逸”- CVSS评分:7.3
- 描述:与上一个CVE类似,此漏洞利用了
/dev/console绑定挂载中的一个缺陷。通过将/dev/pts/$n替换为符号链接,攻击者可以使runc将该符号链接的目标绑定挂载到/dev/console上,从而获得对敏感procfs文件的读写访问权限。
- CVE-2025-52881:“因任意写入原语和procfs写入重定向导致的容器逃逸和拒绝服务”
- CVSS评分:7.3
- 描述:这是一个更复杂的漏洞,可绕过LSM(Linux安全模块)检查。攻击者可以使
/proc/self/attr/<label>引用一个真实的procfs文件,这可用于将写入重定向到恶意目标,如/proc/sysrq-trigger(主机崩溃)或/proc/sys/kernel/core_pattern(完全容器逃逸)。
利用场景与威胁模型
这些漏洞可能在用户可以运行来自恶意或已遭入侵镜像的容器的实际场景中被滥用。例如,允许用户定义自己容器的多租户环境可能面临风险。攻击者可以制作一个包含恶意RUN --mount=...指令的Dockerfile,当构建并运行时,将触发其中一个漏洞,使其能够逃逸容器并控制底层主机。
Kubernetes及云原生影响
在Kubernetes环境中,这些漏洞的影响被放大。一次成功的利用可能允许攻击者逃逸容器,并可能获得对节点kubelet的访问权限,从而控制在该节点上运行的所有其他Pod。从那里,他们可能危及整个集群。这就是为什么所有Kubernetes用户尽快更新其容器运行时至关重要的原因。
受影响版本与补丁
强烈建议用户尽快更新到以下runc版本之一:
- runc v1.4.0-rc.3
- runc v1.3.3
- runc v1.2.8
缓解措施
除了升级runc外,还可以应用以下缓解措施:
- 用户命名空间:使用用户命名空间,且主机的root用户不映射到容器的命名空间中。
- 非root用户:不要在容器内以root用户身份运行。
- AppArmor/SELinux:虽然不是一个完整的解决方案,但使用AppArmor和SELinux有助于缓解部分攻击向量。
同样重要的是,在遵循安全最佳实践的环境中,这些漏洞的实际影响会显著降低。如果您使用一组受控的、经过加固和安全的容器镜像,并通过CI/CD流水线监控部署的安全性和规范性检查,那么被利用的风险就会低得多。这些漏洞在最可能引入和运行不受信任或未经审查的容器镜像的场景中最为关键。
更广阔的视角:安全默认配置
这些漏洞凸显了对容器运行时进行安全默认配置的必要性。OpenSSF和开放容器倡议(OCI)正在努力标准化此类配置,以减少攻击面并防止未来出现类似的漏洞。这是一项持续的努力,社区参与并为此倡议做出贡献至关重要。
其他容器运行时
据了解,其他容器运行时如youki和crun也存在类似的缺陷,正在开发补丁。其他运行时的用户应向其供应商查询安全更新。
致谢
这些漏洞的发现归功于:
- Lei Wang (@ssst0n3 from Huawei)
- Li Fubang (@lifubang from acmcoder.com, CIIC)
- Tõnis Tiigi (@tonistiigi from Docker)
- Aleksa Sarai (@cyphar from SUSE)