影响范围:
docker version <=18.09.2 RunC version <=1.0-rc6
漏洞简介:
攻击者可以通过特定的容器镜像或者exec操作可以获取到宿主机的runC执行时的文件句柄并修改掉runc的二进制文件,从而获取到宿主机的root执行权限。
原理分析:
漏洞的存在原理在于/proc/pid/exe这个绑定的方式,/proc是比较熟知的一个概念,为一个虚拟文件系统,其中的文件能够显示当前的进程运行信息。/proc/pid/exe是一个程序链接,指向这个pid运行的程序。
而这个漏洞的利用方式就在于,在docker里查找到runc的exe,获取对应于该位置的一个文件句柄,然后向这个位置写入东西的话,就能够将宿主机的程序覆盖掉,然后用户下一次再要运行runc的时候,就会触发攻击者要执行的代码。
ps:这个漏洞原理中有一个关键很多文章都没有讲,看着Poc遍历寻找到runc进程就注入很容易以为正常容器容器内是看不到runc的,实际上是能看到的,我测试的时候进入容器命令搞错了,修改的sh但是用的bash进入的容器,可以poc还是显示执行成功了。出去观察,runc又没有被修改,查看了容器的整个启动流程,runc是会在容器内启动runc init的只不过添加了限制,而runc执行/proc/self/exe会调用exec执行runc,新执行出来的进程没有这个限制,所以可以修改,这个才是这个漏洞的核心。
环境搭建:
1 | ./metarget cnv install cve-2019-5736 |
漏洞复现:
对这个漏洞利用是分为容器利用和镜像利用两种的:
- 一种是在已经启动的容器里构造漏洞环境,等被攻击者进入容器触发
- 另一种是构造恶意镜像,等用户执行恶意镜像就会触发攻击,可以用来打供应链
两种方式都有一个常见poc