runc容器逃逸漏洞 (CVE-2024-21626)通告
内容提要
绿盟科技CERT监测到runc官方发布安全通告,修复了一个容器逃逸漏洞(CVE-2024-21626)。攻击者可以通过多种方式进行容器逃逸,导致对主机的完全访问权限。受影响版本为0.0-rc93 <= runc <= 1.1.11,官方已在最新版本中修复该漏洞。
延伸解读
漏洞影响范围广泛
runc作为底层容器运行时,被Docker、containerd、Podman、CRI-O等主流容器平台默认使用,因此该漏洞影响范围极广。任何使用受影响版本runc的环境,无论是否直接调用runc,都可能暴露于容器逃逸风险中。用户需检查容器平台底层runc版本,确认是否在0.0-rc93至1.1.11区间内。
攻击路径与利用条件
攻击者可通过多种方式利用该漏洞:一是利用runc init中的文件描述符泄漏,当特权用户运行恶意镜像时,进程可在宿主机挂载命名空间获得工作目录;二是通过runc exec的–cwd参数与符号链接结合,绕过保护访问主机文件系统;三是覆盖主机二进制文件如/bin/bash,从而在特权用户执行时完全控制主机。利用需要一定条件,如特权用户执行恶意镜像或管理进程调用runc exec。
修复建议与版本升级
官方已在runc 1.1.12中修复该漏洞,建议所有受影响用户尽快升级至该版本或更高。升级时需确保容器平台使用的runc版本同步更新,避免因依赖管理遗漏。对于无法立即升级的环境,应限制不可信镜像的运行,并监控异常容器行为,但根本措施仍是升级。
Q&A
CVE-2024-21626 是什么漏洞?
CVE-2024-21626 是 runc 中的一个容器逃逸漏洞,由于 runc 初始化时存在内部文件描述符泄露,且未验证最终工作目录是否位于容器的挂载命名空间,攻击者可以通过多种方式进行容器逃逸,导致对主机的完全访问权限。
哪些 runc 版本受 CVE-2024-21626 影响?
受影响版本为 0.0-rc93 到 1.1.11(包含 0.0-rc93 和 1.1.11)。runc >= 1.1.12 不受影响。
攻击者如何利用 CVE-2024-21626 进行容器逃逸?
攻击者可以通过三种方式利用:1. 如果容器配置了 process.cwd,特权用户执行恶意镜像时,生成的 pid1 进程会在宿主机挂载命名空间中拥有工作目录,从而访问整个宿主文件系统;2. 在 runc exec 中,恶意进程可用符号链接将路径替换为 /proc/self/fd/7/,绕过 PR_SET_DUMPABLE 保护,通过打开 /proc/$exec_pid/cwd 访问主机文件系统;3. 通过将类似 /proc/self/fd/7/../../../bin/bash 的路径用作 process.args 二进制参数来覆盖主机二进制文件,一旦特权用户执行目标二进制文件,攻击者即可获得对主机的完全访问权限。
如何修复 CVE-2024-21626 漏洞?
官方已在最新版本中修复该漏洞,建议受影响用户尽快升级到 runc 1.1.12 或更高版本。官方下载链接:https://github.com/opencontainers/runc/releases。
runc 是什么?它用在哪些地方?
runc 是一个 CLI 工具,用于根据 OCI 规范在 Linux 上生成和运行容器。它默认运行于 Docker、containerd、Podman 和 CRI-O 等容器,应用范围广泛,支持多种容器格式,可不通过 Docker 引擎直接运行容器。
CVE-2024-21626 漏洞的根本原因是什么?
根本原因是 runc 在初始化时存在内部文件描述符泄露,且未验证最终工作目录是否位于容器的挂载命名空间。具体来说,runc 内部将宿主机 /sys/fs/cgroup 句柄在内的部分文件描述符泄漏到 runc init 中,导致攻击者可以利用这些泄露进行容器逃逸。