CVE-2024-21626 从容器内逃逸到宿主机文件系统」的摘要信息

最近很火的一个 CVE,核心问题是 docker (runc) 在运行用户的代码之前,会 O_CLOEXEC 关闭所有的 fd——这是正确的——但是运行用户代码之前,在 setcwd(2) 的时候,fd 还没有被关闭。这就导致 docker run 和 docker exec 的时候,去通过 -w 参数设置 working directory, 并且设置成一个还没有关闭的 fd ,就能拿到宿主机上的文件路径,从而进入到宿主机。 这个攻击有两个依赖: 能够在容器内部执行代码; 能够设置容器的 working directory (docker run, docker exec, 甚至 docker build 都可以) 演示 在一个全新的 Linux 机器上复现这个攻击。 环境准备 准备一个新的 VM,需要安装的依赖有: 依赖 golang 1.22 和 libseccomp-dev 来编译指定版本的 runc; 依赖 build-essential 编译 runc; 依赖 docker engine,指定版本的 runc; 第一步:按照官方文档安装最新版本的 docker。 第二步:替换 runc (最新版已经解决这个问题了)到旧版本,这里我们使用 v1.0.0-rc10. 编译脚本如下: # install golang wget https://go.dev/dl/go1.22.0.linux-amd64.tar.gz rm -rf /usr/local/go && tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz export PATH=$PATH:/usr/local/go/bin export GOPATH=~/go go version # install dependencies for building ...