docker逃逸漏洞复现(CVE-2019-5736)
字数 896 2025-08-15 21:33:02
Docker逃逸漏洞CVE-2019-5736复现与分析
漏洞概述
CVE-2019-5736是2019年2月11日由runC维护团队报告的一个严重漏洞,由SUSE Linux GmbH高级软件工程师Aleksa Sarai发现。该漏洞影响Docker、containerd、Podman、CRI-O等使用runc作为默认运行时的容器平台,对AWS、Google Cloud等主流云平台也造成威胁。
漏洞影响
- 影响范围:允许攻击者通过特定容器镜像或exec操作获取宿主机runC执行时的文件句柄
- 危害:可修改runc二进制文件,获取宿主机root权限,实现容器逃逸
- 受影响版本:
- Docker version ≤ 18.09.2
- RunC version ≤ 1.0-rc6
漏洞原理
runC是一个低级别容器运行时,最初作为Docker的一部分开发,后被提取为独立工具。高级别容器运行时(如Docker)使用runC处理容器运行相关任务。漏洞存在于runC中,允许攻击者重写宿主机上的runc二进制文件,从而以root身份在宿主机上执行任意命令。
环境准备
1. 卸载现有Docker
sudo apt-get remove docker docker-engine docker-ce docker.io
2. 安装前准备
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-get update
3. 安装指定漏洞版本
# 列出可用版本
apt-cache madison docker-ce
# 安装指定版本(示例)
sudo apt-get install docker-ce=18.06.1~ce~3-0~ubuntu
# 验证安装
sudo systemctl start docker
docker info
漏洞复现
1. 生成Payload
从GitHub获取PoC代码:
https://github.com/Frichetten/CVE-2019-5736-PoC
修改go脚本中的命令为反弹shell命令,设置nc监听地址。
编译生成payload(需要go环境):
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
注意:建议在复现前打快照,漏洞复现会导致docker无法使用。
2. 实施攻击
- 将payload拷贝到docker容器中(模拟攻击者已获取容器权限)
- 在容器中执行payload
- 等待受害者启动docker容器(管理员操作会触发payload)
- 攻击者开启nc监听
- 当受害者启动docker容器时,触发payload反弹shell
修复方案
升级Docker到最新版本,确保runc版本高于1.0-rc6。
总结
CVE-2019-5736是一个严重的容器逃逸漏洞,允许攻击者从容器内获取宿主机root权限。通过理解其原理和复现过程,可以更好地认识容器安全风险,并采取适当防护措施。