目录

容器安全之 Docker 逃逸

一、危险配置

1. PRIVILEGED 特权模式

利用条件:容器以特权模式运行 docker run --privileged

以特权模式运行的容器可以访问宿主机上的所有设备。可以在容器中挂载宿主机的磁盘,然后将根目录切换过去。

2. SYS_ADMIN

利用条件

  1. 以 root 身份运行容器。
  2. 使用 --cap-add=SYS_ADMIN 给容器增加权限。
  3. 没有被 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
echo -e "|/tmp/.payload.py \rcore " > /proc/sys/kernel/core_pattern

三、程序漏洞

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 版本。

五、总结防御手段

  1. 更新 Docker
  2. 更新 runc
  3. 更新 k8s
  4. 升级 Linux 内核
  5. 不以 root 运行容器
  6. 谨慎使用特权模式
  7. 谨慎挂载敏感目录
  8. 注意权限参数的使用