CVE-2024-21626容器逃逸漏洞提醒

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: RUNC最近爆出8.6分高危容器逃逸漏洞,目前这个漏洞比较容易被利用,破坏性也极强,请大家注意升级相关系统。如果升级过程遇到兼容性问题,可以参考:https://mp.weixin.qq.com/s/Mm2xHPeSOn-EmbR6q0Re7g

漏洞简介

2023年12月19日,runc社区收到来自docker社区转发过来的安全通告,来自snyk的rmcnamara-snyk研究发现,由于runc由来已久的一个文件描述符泄露bug,攻击者可以通过容器的“工作目录”参数(.process.cwd,对应的docker的参数为--workdir),利用这个泄露的文件描述符,控制容器所在主机的整个文件系统;经过runc社区维护者的深入挖掘,来自SUSE和赛码网的工程师们发现,攻击者还可以通过容器启动参数(.process.args,对应的docker参数为--entrypoint),利用这个泄露的文件描述符,直接覆盖主机上的可执行文件,从而达到完全逃逸到主机的目的。目前这个漏洞的编号为:CVE-2024-21626。

这个漏洞的利用,其实和2019年的CVE-2019-5736容器逃逸漏洞类似,都是利用linux的伪文件系统/proc进行攻击,容器运行时runc在启动真实的容器进程之前,其实是通过/proc/self/exe init创建的一个进程(以下简称init进程),在设置完资源隔离和资源限制后,通过execve系统调用来启动真正的容器进程。在容器进程真正启动之前,其实一直是runc在工作,runc进程其实是某个容器的第一个进程,所以runc进程本身是已经泄漏到容器空间当中的,这是CVE-2019-5736容器逃逸漏洞的根本原因。但是,既然runc在真正的容器进程启动之前一直在做工作,所以任何的疏忽大意,都有可能造成资源被泄漏到容器空间。不幸的是,这样的bug确实存在,在runc的某些代码重构过程中,不小心把两个主机文件描述符/sys/fs/cgroup泄漏到了init进程(并未泄漏到最终的容器空间),导致了本次逃逸的发生。这种文件描述符的泄漏对于runc本身的测试来说很难发现,因为他被init进程打开的其他文件描述符覆盖了。但是和docker或kubernetes结合在一起时,就增加了被发现的机会,因为他们打开了更多的文件描述符,从而导致runc泄漏的文件描述符没有被覆盖。

由于泄漏的文件描述符指向的是所在主机文件夹/sys/fs/cgroup,例如其对应的描述符是9,则linux伪文件系统/proc中的魔术链接(Magic Link)/proc/self/fd/9对应的就是所在主机文件夹/sys/fs/cgroup,而/proc/self/fd/9/..对应的并不是/proc/self/fd,而是所在主机文件夹/sys/fs,假如将容器的工作目录设置为/proc/self/fd/9,在容器启动后,攻击者可以通过cd ../../../..逃逸到容器所在主机的根目录,如果容器是以root身份运行的,就可以为所欲为了。在接到安全通报后,赛码网和SUSE工程师第一时间提交了安全补丁,对这个漏洞进行修复。首先当然是要修复文件描述符泄漏的BUG(简称patch1),然后为了预防以后在再次出现类似的文件描述符泄漏后不至于造成容器逃逸,我们还提交了patch2, 对工作目录参数进行校验,linux的getcwd调用会对是否是合法的工作目录进行判断。

这个漏洞封堵后,赛码网工程师继续深入挖掘,对于patch2,其实做的还不到位,因为如果未来还发生类似于patch1所封堵的文件泄漏bug,仅仅封堵工作目录这一个地方是不够的,execve系统调用也可以对这个泄漏的文件描述符进行滥用。假设攻击者将容器的启动命令设置为/proc/self/fd/9/../../../bin/bash,那么对于容器进程来说,/proc/self/exe指向的就是所在主机上的可执行文件/bin/bash,利用CVE-2019-5736的原理,对其进行覆盖。因此,为了避免未来的文件描述符泄漏带来类似的容器逃逸,runc维护者们在调用execve启动真正的容器业务进程之前,对不必要的文件描述符进行显式关闭,这就可以做到万无一失了。当然,未来不出现文件描述符泄漏bug是我们应该追求的目标。

修复建议

这是一个高危漏洞,10分制危害评分等级为8.6分,建议有条件的用户,将runc升级到v1.1.12(或通过上游升级),但是,可能需要做一些兼容性测试,如果确实无法对runc进行升级,则看能否在您所使用的runc版本上应用这些补丁后进行重新编译。如果都不行,则需要做到:

1、不下载运行来历不明的容器镜像;

2、启动容器或exec进入一个容器时,一定要显式声明工作目录和启动进程名;例如:docker run --workdir= --entrypoint= …

3、对于提供云服务的厂商,则一定要做校验用户提供的cwd和entrypoint参数,不提供linux伪文件系统/proc的自定义挂载,不使用linux的伪文件系统作为cwd和entrypoint参数,例如不能使用/proc/开头。但是这也不保险,因为对于entrypoint参数,我们可以使用Shebang来避开校验。您也可以使用(dmz)[https://github.com/opencontainers-sec/go-containersec]来进行临时的防护。当然,云服务厂商升级到1.1.12或者应用这些补丁代码是我们所强烈建议的。

4、如果版本升级实在跨度太大,可以在你现在跑的runc正式版本上,应用这个最小的补丁:https://github.com/lifubang/runc/pull/63

参考

https://github.com/opencontainers/runc/security/advisories/GHSA-xr7r-f8xq-vfvv

https://github.com/opencontainers/runc/releases/tag/v1.1.12

https://www.cve.org/CVERecord?id=CVE-2024-21626

dmz:赛码网为容器运行时社区runc提供的一个简化防护CVE-2019-5736的提案,目前已被接纳,但是应用生产还有一段路要走,请参考https://github.com/opencontainers/runc/pull/3983,另一个替换提案在论证中:https://github.com/opencontainers/runc/pull/4137#issuecomment-1905756274

原文链接:https://mp.weixin.qq.com/s/Mm2xHPeSOn-EmbR6q0Re7g

目录
相关文章
|
1月前
|
安全 Cloud Native Shell
云上攻防:云原生篇&Docker容器逃逸
本文介绍了Docker的基本概念及其对渗透测试的影响,重点讲解了容器逃逸的方法。Docker是一种轻量级的容器技术,与虚拟机相比,具有更高的便携性和资源利用率。然而,这也带来了安全风险,特别是容器逃逸问题。文章详细描述了三种常见的容器逃逸方法:不安全的配置、相关程序漏洞和内核漏洞,并提供了具体的检测和利用方法。此外,还介绍了几种特定的漏洞(如CVE-2019-5736和CVE-2020-15257)及其复现步骤,帮助读者更好地理解和应对这些安全威胁。
云上攻防:云原生篇&Docker容器逃逸
|
3月前
|
运维 安全 Cloud Native
"揭秘!Trivy——云原生时代的隐形安全侠,一键扫描,让容器镜像漏洞无所遁形,守护你的云端帝国坚不可摧!"
【8月更文挑战第14天】在云原生时代,容器技术如Docker与Kubernetes大放异彩,加速了应用部署。但容器化的普及也带来了安全挑战,尤其是镜像的安全性至关重要。Trivy,一款高效且轻量级的镜像安全扫描工具应运而生,成为开发者与运维人员的得力助手。它由Aqua Security开发,支持一键式全面扫描,能快速检测镜像中的漏洞与配置风险,并提供修复建议。Trivy采用Go语言编写,轻巧高效,支持多平台,并可轻松集成到CI/CD流程中,确保只有安全的镜像才能部署到生产环境。无论新手还是专家,Trivy都是构建安全可靠云环境的理想选择。
84 2
|
5月前
|
Cloud Native 安全 Docker
云上攻防-云原生篇&Docker安全&系统内核&版本&CDK自动利用&容器逃逸
云上攻防-云原生篇&Docker安全&系统内核&版本&CDK自动利用&容器逃逸
120 5
|
5月前
|
容器 安全 Docker
浅谈容器逃逸
【6月更文挑战第2天】容器逃逸是严重的安全风险,威胁云计算系统的安全。
|
6月前
|
安全 Linux Go
【CVE-2024-21626】容器逃逸漏洞修复
【CVE-2024-21626】容器逃逸漏洞修复
|
11月前
|
安全 Cloud Native Unix
Copa:无需重建镜像,直接修补容器漏洞
Copa:无需重建镜像,直接修补容器漏洞
201 0
H8
|
安全 网络协议 Shell
Docker 枚举、特权升级和容器逃逸 (DEEPCE)
为了使其与最大数量的容器兼容,DEEPCE 是纯编写的sh,没有依赖性。如果可用,它将使用其他工具,例如 curl、nmap、nslookup 和 dig,但在大多数情况下不依赖于它们进行枚举。 枚举都不应该触及磁盘,但是大多数漏洞利用会创建新的容器,这将导致磁盘写入,并且一些漏洞利用会覆盖 runC,这可能具有破坏性,所以要小心!
H8
191 0
|
存储 Kubernetes 负载均衡
基于 Cilium 和 eBPF 检测容器逃逸
如果运行云原生工作负载均衡设施,则可以更好地保护我们的服务。毕竟,服务经常向公众暴露以及工作负载可能属于不同的租户。在这篇博文中,我将向大家展示访问我们的 Kubernetes 集群的攻击者如何进行容器逃逸:运行 Pod 以获得 root 权限,将 Pod 转义到主机上,并通过不可见的 Pod 和无文件执行来持续攻击。同时,我将向大家展示如何基于 Isovalent Cilium Enterprise 进行攻击检测。
270 0
|
5天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
23 2
|
15天前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。