容器安全之 Docker 逃逸
目录
一、危险配置
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 负责配置进程崩溃时内存转储数据的导出方式。从 2.6.19 内核版本开始,Linux 支持在 /proc/sys/kernel/core_pattern 中使用新语法。如果该文件中的首个字符是管道符’|’,那么该行的剩余内容将被当作用户空间程序或脚本解释并执行。
payload:
|
|
三、程序漏洞
1. CVE-2019-5736
CVE-2019-5736 是一个严重的容器逃逸漏洞,影响 Docker 默认设置下的容器安全。攻击者可利用此漏洞获得宿主机 root 权限。
四、内核漏洞
1. CVE-2016-5195 DIRTY-COW 脏牛漏洞
存在于 Linux 内核 2.6.22 及以后的版本中,是 Linux 内核级的本地提权漏洞。
2. CVE-2017-1000405 大脏牛漏洞
影响范围包括 Linux kernel 2.6.38 至 4.14 版本。
五、总结防御手段
- 更新 Docker
- 更新 runc
- 更新 k8s
- 升级 Linux 内核
- 不以 root 运行容器
- 谨慎使用特权模式
- 谨慎挂载敏感目录
- 注意权限参数的使用