简单聊聊 CVE-2024-21626

简单聊聊 CVE-2024-21626

💡 原文中文,约5100字,阅读约需13分钟。
📝

内容提要

本文讨论了容器逃逸漏洞CVE,介绍了漏洞的复现过程和原理,并提供了探测方法。漏洞利用文件描述符泄漏,使容器内进程能够访问宿主机文件。文章提到了使用eBPF+Tracepoint进行探测的方法。

🔎

延伸解读

漏洞影响范围与修复紧迫性

CVE-2024-21626 影响 runc 1.0 至 1.1.11 版本,几乎覆盖了所有主流容器运行时。由于漏洞可通过镜像分发方式低成本利用,任何使用受影响 runc 的环境都可能被攻击。文章强调及时更新 runc 版本是必要的修复措施,否则容器逃逸风险持续存在。

技术根源:文件描述符泄漏与 openat2

漏洞源于 runc 在检测 openat2 支持时,使用 unix.Openat2 打开 cgroup 目录但未设置 O_CLOEXEC 且未关闭文件描述符,导致描述符泄漏。该描述符指向宿主机 /sys/fs/cgroup,容器内进程可通过 /proc/self/fd/ 访问,进而结合 chdir 实现逃逸。

探测思路:监控 chdir 系统调用

文章提供了一种基于 eBPF 和 Tracepoint 的探测方法,通过监控 sys_enter_chdir 事件,捕获目标路径为 /proc/self/fd/* 的 chdir 调用。用户态程序可进一步分析路径和调用栈,识别是否为 runc 发起的可疑操作,从而发现潜在攻击。

❓

Q&A

CVE-2024-21626 是什么漏洞?

CVE-2024-21626 是 runc 中的一个容器逃逸漏洞,影响 runc 1.0 到 1.1.11 版本。攻击者可以通过镜像分发的方式低成本地实现容器逃逸,利用文件描述符泄漏使容器内进程能够访问宿主机文件。

如何复现 CVE-2024-21626 漏洞?

复现需要准备 Docker 环境,安装 Docker、libseccomp 和 golang。然后编译安装存在漏洞的 runc 版本(如 v1.1.0-rc.1),并构建一个 Dockerfile,其中设置 WORKDIR 为 /proc/self/fd/7/。运行容器后,通过 cd ../.. 即可访问宿主机文件。

CVE-2024-21626 漏洞的原理是什么?

漏洞源于 runc 在启动过程中使用 openat2 系统调用打开 cgroup 文件时未设置 O_CLOEXEC 标志,导致文件描述符泄漏。泄漏的文件描述符指向宿主机的 /sys/fs/cgroup 目录。当容器进程的工作目录被设置为 /proc/self/fd/7 时,容器内进程的当前工作目录就指向了宿主机的 cgroup 目录,从而可以访问宿主机文件。

如何探测 CVE-2024-21626 漏洞?

可以使用 eBPF 和 Tracepoint 进行探测。攻击特征为使用 chdir 系统调用且目标路径为 /proc/self/fd/*。通过监控 sys_enter_chdir tracepoint,捕获 chdir 调用的路径,并在用户态用正则匹配 /proc/self/fd/ 路径即可发现潜在攻击。

哪些 runc 版本受 CVE-2024-21626 影响?

该漏洞影响 runc 1.0 到 1.1.11 版本。

如何修复 CVE-2024-21626 漏洞?

及时更新 runc 版本到修复后的版本是必要的。

🏷️

标签

➡️

继续阅读