一、危险配置
1. Privileged 特权模式
利用条件:容器以特权模式运行
docker run --privileged
以特权模式运行的容器可以访问宿主机上的所有设备。
可以在容器中挂载宿主机的磁盘,然后将根目录切换过去。
2. SYS_ADMIN
利用条件:
- 以
root
身份运行容器。 - 使用
--cap-add=SYS_ADMIN
给容器增加权限。 - 没有被 AppArmor 限制运行
mount syscall
,比如使用了启动参数--security-opt apparmor=unconfined
。
二、危险挂载
1. 挂载 socket
利用条件:将/var/run/docker.sock
文件挂载到了容器中。
Docker 是通过 docker.sock
文件与容器进行通信的,所以当 docker.sock
挂载到容器中时,容器内也可以通过这个文件与其它容器通信,在容器内安装 Docker 客户端,执行 Docker 命令就相当于在宿主机执行 Docker 命令了。
比如可以创建一个特权模式运行的容器,然后进行上面类似的操作。
2. 挂载 proc 目录
利用条件:将/proc/sys/kernel/core_pattern
文件挂载到了容器中。
漏洞原理是/proc/sys/kernel/core_pattern
负责配置进程崩溃时内存转储数据的导出方式,如果进程崩溃了,系统内核会捕获到进程崩溃信息,并将信息传递给 core_pattern
中的程序或者脚本。
从 2.6.19 内核版本开始,Linux 支持在 /proc/sys/kernel/core_pattern
中使用新语法。如果该文件中的首个字符是管道符’|’,那么该行的剩余内容将被当作用户空间程序或脚本解释并执行。
后面只需往文件中写入 payload,引发某个程序崩溃即可运行恶意代码。
payload
echo -e "|/tmp/.payload.py \rcore " > /proc/sys/kernel/core_pattern
这个 payload 有两个细节,一个是.payload.py
是隐藏文件,只用 ls
看不到,二是使用了\r
和很多个空格,这样 cat
就看不到前面的恶意代码。
\r
在 Linux 系统中表示将光标移动至行首,相当于将 「core 」
盖在 「|/tmp/.payload.py」
的上面,这就是为什么后面需要加很多个空格,太短盖不住。
三、程序漏洞
1. CVE-2019-5736
CVE-2019-5736 是一个严重的容器逃逸漏洞,影响 Docker 默认设置下的容器安全。攻击者可利用此漏洞获得宿主机 root 权限,威胁整个系统的安全。漏洞源于 Docker 18.09.2 之前版本使用的 runc 组件,允许篡改宿主机上的 runc 二进制文件。
四、内核漏洞
1. CVE-2016-5195 Dirty-CoW 脏牛漏洞
CVE-2016-5195 是一个 Linux 内核级的本地提权漏洞,存在于 Linux 内核 2.6.22 及以后的版本中。该漏洞源于 Linux 内核内存子系统在处理私有只读存储映射时的写时拷贝机制存在条件竞争问题。攻击者可利用此漏洞获取对其他只读内存映射的写权限,进而可能提升权限,对系统安全构成威胁。
2. CVE-2017-1000405 大脏牛漏洞
CVE-2017-1000405 是一个 Linux 内核的本地竞争条件漏洞,影响范围包括 Linux kernel 2.6.38 至 4.14 版本。攻击者可利用此漏洞在受影响系统上下文中修改任意文件,可能导致拒绝服务或执行任意代码。这个漏洞是由于 Linux Kernel 在实现上存在本地竞争条件而引发的。
五、总结防御手段
- 更新 Docker
- 更新 runc
- 更新 k8s
- 升级 Linux 内核
- 不以 root 运行容器
- 谨慎使用特权模式
- 谨慎挂载敏感目录
- 注意权限参数的使用