编辑 | zouyee
runC社区于2024年2月1日披露了高危安全漏洞CVE-2024-21626,攻击者可以利用该漏洞越权访问宿主机文件或执行二进制程序,详细内容参见下文
CVE-2024-21626: 提权漏洞
CVSS评分: CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H - 高风险 (8.6)
由于runc存在内部文件描述符泄露,本地攻击者可以通过多种方式进行容器逃逸:
runc将包括宿主机 /sys/fs/cgroup的几个文件描述符泄漏到runc init中,攻击者可以利用这一漏洞欺骗具有特权的用户执行恶意容器镜像,导致pid1进程在宿主机挂载命名空间中拥有一个工作目录,生成的进程可以访问整个宿主文件系统。
runc exec中同样存在文件描述符泄漏和工作目录验证不足的情况。如果容器内的恶意进程知道某个管理进程将使用 --cwd 参数和给定路径调用 runc exec,便可以通过符号链接将该路径替换为 /proc/self/fd/7/。一旦容器进程执行了容器镜像中的可执行文件,可以绕过PR_SET_DUMPABLE保护,之后攻击者可以通过打开 /proc/$exec_pid/cwd 来访问主机文件系统。
可以通过将类似 /proc/self/fd/7/../../../bin/bash 的路径用作 process.args 二进制参数来覆盖主机二进制文件来改进攻击1、2。由于可以覆盖类似 /bin/bash 的二进制文件,一旦特权用户在主机上执行目标二进制文件,攻击者就可以进行转移,以完全访问主机。
Am I vulnerable?
Snyk 在 Docker 引擎以及其他容器化技术(例如 Kubernetes)使用的runc<=1.1.11的所有版本中发现了一个漏洞。利用此问题可能会导致容器逃逸到底层主机操作系统,无论是通过执行恶意映像还是使用恶意 Dockerfile 或上游映像构建映像(即使用时FROM方式)
Affected Versions
v1.0.0-rc93 ~ 1.1.11
How do I mitigate this vulnerability?
上述漏洞可以通过社区提供的runc补丁来避免。
Fixed Versions
>= 1.1.12
Detection
Snyk的new Helios团队已开发了一款针对该漏洞的运行时检测工具,https://github.com/snyk/leaky-vessels-dynamic-detector,该工具代码采用Apache-2.0许可。该独立工具提供了一个参考的实现方式,用于在执行时检测漏洞。其将eBPF hook绑定到内核和用户级函数以及包检测器上,从而能够报告容器构建和运行容器的调用,如果它们匹配任何可能存在利用尝试的模式。
Acknowledgements
感谢来自Snyk的Rory McNamara发现并披露了原始漏洞(攻击1)给Docker,感谢acmcoder的lifubang发现了如何复现(攻击3a)以覆盖主机二进制文件,以及感谢SUSE的Aleksa Sarai发现了如何复现(攻击2和3b)通过runc exec方向实现容器逃逸。
由于笔者时间、视野、认知有限,本文难免出现错误、疏漏等问题,期待各位读者朋友、业界专家指正交流。
1. https://github.com/kyverno/kyverno/security/advisories/GHSA-3hfq-cx9j-923w
2. https://www.ddosi.org/cve-2024-21626/
3. https://cert.360.cn/warning/detail?id=65bb589cc09f255b91b17d32
4. https://snyk.io/blog/leaky-vessels-docker-runc-container-breakout-vulnerabilities/
5. https://github.com/opencontainers/runc/security/advisories/GHSA-xr7r-f8xq-vfvv 6.https://github.com/opencontainers/runc/commit/02120488a4c0fc487d1ed2867e901eeed7ce8ecf
7
. https://www.secrss.com/articles/63427👇🏻 真诚推荐你关注👇🏻