7.3.4. 攻击面分析

7.3.5. 供应链安全

在构建Dockerfile的过程中,即使是使用排名靠前的来源,也可能存在CVE漏洞、后门、镜像被污染、镜像中的依赖库存在漏洞等问题。

7.3.6. 容器逃逸

7.3.6.1. 虚拟化风险

虽然Docker通过命名空间进行了文件系统资源的基本隔离,但仍有 /sys/proc/sys/proc/bus/devtimesyslog 等重要系统文件目录和命名空间信息未实现隔离,而是与宿主机共享相关资源。

7.3.6.2. 利用内核漏洞逃逸

  • CVE-2022-0847 Dirty Pipe
  • CVE-2021-4034 Polkit
  • CVE-2018-18955
  • CVE-2016-5195

7.3.6.3. 容器逃逸漏洞

  • CVE-2021-41091
  • CVE-2020-15257 Containerd 逃逸
    • 需要网络设置为 host 模式
  • CVE-2019-14271 Docker cp
  • CVE-2019-13139 Docker build code execution
  • CVE-2019-5736 runC
    • Docker Version < 18.09.2
    • Version <= 1.0-rc6

7.3.6.4. 配置不当

  • 开启privileged
  • 挂载宿主机敏感目录
  • 配置cap不当
    • --cap-add=SYS_ADMIN
  • 绕过namespace
    • --net=host
    • --pid=host
    • --ipc=host

7.3.6.5. 危险挂载

  • 挂载 /var/run/docker.sock
  • 挂载宿主机 /dev /proc 等危险目录

7.3.6.6. 逃逸技巧

  • 通过 binfmt_misc 逃逸
  • 通过 eBPF 逃逸

7.3.7. 拒绝服务

  • CPU耗尽
  • 内存耗尽
  • 存储耗尽
  • 网络资源耗尽

7.3.8. 攻击 Docker 守护进程

虽然 Docker 容器具有很强的安全保护措施,但是 Docker 守护进程本身并没有被完善的保护。Docker 守护进程本身默认由 root 用户运行,并且该进程本身并没有使用 Seccomp 或者 AppArmor 等安全模块进行保护。这使得一旦攻击者成功找到漏洞控制 Docker 守护进程进行任意文件写或者代码执行,就可以顺利获得宿主机的 root 权限而不会受到各种安全机制的阻碍。值得一提的是,默认情况下 Docker 不会开启 User Namespace 隔离,这也意味着 Docker 内部的 root 与宿主机 root 对文件的读写权限相同。这导致一旦容器内部 root 进程获取读写宿主机文件的机会,文件权限将不会成为另一个问题。这一点在 CVE-2019-5636 利用中有所体现。

7.3.9. 其他CVE

  • CVE-2014-5277
  • CVE-2014-6408
  • CVE-2014-9357
  • CVE-2014-9358
  • CVE-2015-3627
  • CVE-2015-3630