跳转至

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 用户运行。

参考

回到页面顶部