Docker 远程执行命令漏洞
2016-06-01 by dongnan
漏洞描述
运行 docker swarm
组件,特别是公网暴露了TCP 2375
端口,可以远程执行任意 docker
命令,比如下载、删除、启动、甚至获得宿主机 root
权限。
漏洞原因
为了实现集群管理,Docker提供了远程管理接口。Docker Daemon
作为守护进程,运行在后台可以执行发送到管理接口上的 Docker命令。
启动 Docker Daemon
时,加入-H 0.0.0.0:2375
,守护进程就可以接收远端的Docker 客户端发送的命令。
Docker 是把2375
端口作为非加密端口暴露出来,一般是用在测试环境中。
此时没有任何加密和认证过程,只要知道Docker宿主机的IP
,任何人都可以管理这台主机上的容器和镜像。
测试漏洞
版本信息
# 执行命令
docker -H 106.39.xxx.xxx:2375 info
Containers: 2
Images: 243
Server Version: 1.9.1
Storage Driver: devicemapper
Pool Name: docker-8:5-1075481653-pool
Pool Blocksize: 65.54 kB
Base Device Size: 10.74 GB
Backing Filesystem:
Data file: /dev/loop0
Metadata file: /dev/loop1
#...省略
CPUs: 24
Total Memory: 62.73 GiB
Name: 106.39.160.101
ID: ZGXI:XXX
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
运行的容器
docker -H 106.39.xxx.xxxx:2375 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2e8208a24a64 centos "/bin/bash" 19 minutes ago Up 19 minutes sick_ride
56e1c87d86f3 centos "/bin/bash" 20 minutes ago Up 20 minutes furious_goldberg
解决方法
- 使用防火墙配置
2375
端口仅允许信任IP进行通信。 - 使用
tls
证书认证通信。
小结
如此容易的获取 root
权限,表示这个世界没有绝对的安全,需要不断更新安全策略,以阿里云的这台主机来说:
- 使用
vpc
与安全组,做好公/私网络端口隔离,仅允许信任的IP通信。 - 禁止 root 用户登陆系统。
- Docker守护进程不使用
root
用户运行。