您的需求已经提交,我们将在48小时内联系您
全国服务热线:400-1000-221
确定
免费享受企业级云安全服务
获取手机验证码
{{message}}
免费试用

安全预警:Docker Remote API未授权访问漏洞

作者:
发布时间:2016-05-17

docker swarm 是一个将docker集群变成单一虚拟的docker host工具,使用标准的Docker API,能够方便docker集群的管理和扩展。 近日,docker remote api 未授权访问导致代码泄露、获取服务器root权限的漏洞被曝,漏洞影响较大。

漏洞发现起因

漏洞发现的起因是,有一位同学在使用docker swarm的时候,发现了管理的docker 节点上会开放一个TCP端口2375,绑定在0.0.0.0上,http访问会返回 404 page not found ,然后他研究了下,发现这是 Docker Remote API,可以执行docker命令,比如访问 http://host:2375/containers/json 会返回服务器当前运行的 container列表,和在docker CLI上执行 docker ps 的效果一样,其他操作比如创建/删除container,拉取image等操作也都可以通过API调用完成。

swarm是用来管理docker集群的,应该放在内网才对。之后问了才发现,他是在公网上的几台机器上安装swarm的,并且2375端口的访问策略是开放的,所以可以直接访问。

漏洞影响

影响总结:攻击者可以利用该漏洞执行docker命令,获取敏感信息,并获取服务器root权限。

目前在公网上暴露的2375端口还有不少,测了一些基本都可以利用。

但docker swarm更多的情况是用在企业内部,虽然在内网,也不意味着绝对安全,当边界被突破,就危险了。

修复方案

如果你的2375端口是暴露在公网的,那么最简单的方式就是禁止外网访问或者设置白名单,因为根据官网介绍,swarm本来就不应该在公网中使用。

以上方法仅仅防止了外网访问,但如果本身已经在内网,对于已经撸进内网的攻击者,端口仍然处于可以直接访问的状态,那么有没一些防护方案呢?

在docker swarm文档,Plan for Swarm in production 这篇文章提到了两种方案:

第一种方法是使用TLS认证:Overview Swarm with TLS 和 Configure Docker Swarm for TLS这两篇文档,说的是配置好TLS后,Docker CLI 在发送命令到docker daemon之前,会首先发送它的证书,如果证书是由daemon信任的CA所签名的,才可以继续执行,官网图如下: 

然而在对公网中使用TLS的docker remote api(使用2376端口)测试中发现,即使没有证书,Docker CLI仍然可以正常访问,这里我也拿docker python api写了脚本,设置不验证证书有效性,也同样可以访问。(备注:因为没有具体配置过TLS,只能根据以上测试结果推测,走TLS认证,只能防止MITM 攻击,还是无法解决端口未授权访问的问题。)

第二种方法是网络访问控制(Network access control):文档中列出了 Swarm manager,Swarm nodes 等用到的端口,告诉你要配置合理的访问规则。文档中还提到了这么一段话

For added security you can configure the ephemeral port rules to only allow connections from interfaces on known Swarm devices.

大概意思是只允许信任的swarm devices之间通信。

理想情况就是docker 节点的2375端口只允许swarm manager来访问,但因为swarm manager可能会有多个,就需要配置多条规则,维护起来可能会具有一定复杂度,但只要swarm manager所在机器不被撸,就可以保证docker 节点的2375端口不被未授权访问。当然,这里还需要结合TLS一起使用。

总的来说就是,不要将端口直接暴露在公网,内网中使用需要设置严格的访问规则,并使用TLS。

原文地址:http://drops.wooyun.org/papers/15892

标签: