docker容器逃逸指的是攻击者通过劫持容器化业务逻辑或直接控制等方式,已经获得容器内某种权限下的命令执行能力的过程和结果;因为docker使用的是隔离技术,因此容器内的进程无法看到外面的进程,但外面的进程可以看到里面,所以如果一个容器可以访问到外面的资源,甚至是获得了宿主主机的权限,这就叫做“Docker逃逸”。
本教程操作环境:linux7.3系统、docker19.03版、Dell G3电脑。
什么是docker容器逃逸
「容器逃逸」指这样的一种过程和结果:首先,攻击者通过劫持容器化业务逻辑,或直接控制(CaaS等合法获得容器控制权的场景)等方式,已经获得了容器内某种权限下的命令执行能力;
攻击者利用这种命令执行能力,借助一些手段进一步获得该容器所在直接宿主机(经常见到“物理机运行虚拟机,虚拟机再运行容器”的场景,该场景下的直接宿主机指容器外层的虚拟机)上某种权限下的命令执行能力。
因为Docker所使用的是隔离技术,就导致了容器内的进程无法看到外面的进程,但外面的进程可以看到里面,所以如果一个容器可以访问到外面的资源,甚至是获得了宿主主机的权限,这就叫做“Docker逃逸”。
目前产生Docker逃逸的原因总共有三种:
-
由内核漏洞引起。
-
由Docker软件设计引起。
-
由特权模式与配置不当引起。
接下来依次对这三种逃逸方法做简单说明。
1、由于内核漏洞引起的逃逸
因为Docker是直接共享的宿主主机内核,所以当宿主主机的内核存在安全漏洞时会一并影响Docker的安全,导致可能会造成Docker逃逸。具体流程如下:
-
使用内核漏洞进入内核上下文
-
获取当前进程的task struct
-
回溯task list 获取pid = 1的task struct,复制其相关数据
-
切换当前namespace
-
打开root shell,完成逃逸
2、由于Doker软件设计引起的逃逸
比较典型的例子是Docker的标准化容器执行引擎—-runc。Runc曾在2019年2月被爆出来过一个Docker逃逸漏洞CVE-2019-5736。其漏洞原理是,Docker、Containerd或其他基于runc的容易在运行时存在安全漏洞,攻击者可以通过特定的容器镜像或者exec操作获取到宿主机runc执行文件时的文件句柄并修改掉runc的二进制文件,从而获取到宿主机的root执行权限,造成Docker逃逸。
3、由于特权模式+目录挂载引起的逃逸
这一种逃逸方法较其他两种来说用的