cve-2019-5736分析与复现

影响范围:

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

漏洞复现: