了解容器生态系统中的漏洞情况对于网络安全的研究至关重要,今天我们就把话题转向Docker镜像,看看Docker官方软件库中当前的漏洞状态是什么?
Docker官方仓库主要包含开源和商业软件的镜像,通常由作者或供应商管理,并包含Docker社区中 使用最广泛的镜像。其中有 20个最流行的镜像的的pull下载超过千万次。目前已有越来越多地第三代配置管理软件用这些镜像来替代其分布式系统管理的一些功能。
很少有技术能够像 docker 这样一出来就受到关注,并在很短的时间里发展壮大,而且几乎所有的技术公司都开始使用或者希望使用。随着 docker 的出现,配置管理、微服务、数据中心自动化、devops 多个领域都重新焕发新机,好像 IT 行业的整个架构都要重新定义一样。
虽然Docker官方非常认真对待安全问题,但由于这个项目侧重于开源性的社区化服务,所以,出现安全漏洞的镜像也是难免的。我们在2月6日对Docker官方存储库做了一个扫描分析,截至目前Docker官方总共有133个仓库,我们对其中的91个仓库进行了扫描分析。
对标注了最新的Docker镜像进行扫描分析,24%的最新的Docker镜像具有高危和中危漏洞,其中 10.53%具有高危漏洞。
Ubuntu镜像明显比Debian镜像有着更多的漏洞。 Debian是最不易受到攻击镜像,它的高危和中危漏洞最少,只有8%,相比之下比Ubuntu的高危和中危漏洞是27%。基于RHEL的漏洞分布样本量非常小(只有4%)。
Linux操作系统的发行版本可以大体分为两类,一类是商业公司维护的发行版本,一类是社区组织维护的发行版本,前者以著名的Redhat(RHEL)为代表,后者以Debian为代表。但目前Debian被广泛使用,而RHEL的使用却是最少的。 Debian是Docker官方仓库中的主力军,在最新标记的镜像中占了79%以上,而Ubuntu约占16%,而基于RHEL的镜像占了剩余的4%。
Docker的用户和维护者们,倾向于将镜像保持到最新,但是老一些的镜像却被忽略;创建容器数量之大和速度之快,让老的镜像在更新的时候被忽略。从安全漏洞评分系统(CVSS)来看,旧版的Debian和Ubuntu有着更多的漏洞。
Debian 8.6和Ubuntu 14.04中高危和中危漏洞的数量比它们所对应的新版本(Debian 8.7和Ubuntu 16.04)要高得多。
从图中可以看出,新版本的安装和更新的软件包较少。虽然这不是漏洞多少的直接指示,但这意味大量的漏洞仍在被使用。
最常见的漏洞是“SSL Death Alert” (即“OpenSSL红色警戒”漏洞),通用漏洞编号CVE-2016-8610,这是一个DoS能力的漏洞,影响针对GnuTLS,OpenSSL和NSS编译的软件,包括nginx提供的HTTPS服务。攻击者可以很容易的利用该漏洞在一个消息中打包大量未定义类型警告包,使服务或进程陷入无意义的循环,从而导致占用掉服务或进程100%的CPU使用率。
各个镜像中最常见的普通漏洞
Debian:OpenSSL本地信息泄露漏洞(CVE-2016-7056)存在于Debian 86%的镜像中。OpenSSL某些版本在crypto/ecdsa/ecdsa_ossl.c的signing函数存在定时攻击漏洞,具有本地访问权的攻击者利用此漏洞可恢复ECDSA P-256密钥,因此虽然存在严重漏洞,但不大可能影响大多数人。
Ubuntu:如上所述CVE-2016-8610存在于Ubuntu 93%的镜像中。
RHEL:Vim 任意代码执行漏洞(CVE-2016-1248)存在于RHEL 50%的镜像中。
各个镜像中最常见的高危漏洞
Webkit的Memory Corruption:Safari Webkit引擎漏洞(CVE-2016-4658),用户点击恶意链接后,就能对设备产生危害,存在于linux5%的镜像中。该高危漏洞不仅仅对CVE中提到的苹果产品有影响,还对XML解析程序和标记工具集libxml2有很大的危害,使得libxml功能可以被远程访问,包括nokogiri和解析XML / HTML的大多数开源软件。
鉴于大量服务通过非加密信道更新,而且不检查下载的安装包是否真实,攻击者利用MITM获得多台计算机控制权的途径也是很多的。
比如CVE-2016-1252,一个APT(高级软件包工具)签名绕过漏洞利用。黑客组织手握大量类似漏洞和匹配的零日漏洞利用丝毫不令人意外。攻击者或许也用不着绕过TLS,因为大部分Linux发行版的默认APT源都不使用TLS。
CVE-2016-1252存在于linux5%的镜像中,影响Debian 8.7和Ubuntu 16.10,Ubuntu16.04和Ubuntu14.04。
那么,防御者该怎样防止这些镜像漏洞呢?
虽然减少Docker镜像中的漏洞有点困难,但我们这里还是有一些预防建议,用户可以在镜像构建过程中对安装软件包进行快速更新。如果可以,可以让你的镜像上的程序包运行时自动更新软件包。另外向镜像构建过程添加漏洞分析。通过使用最小化的Linux发行版例如Alpine ,现在所有的Docker官方镜像都使用Alpine,Alpine包含了静态编译的仅依赖于其所编译的内核的二进制程序。
延伸阅读:容器生态系统的介绍
容器引擎:
容器引擎(Engine)或者容器运行时(Runtime)是容器系统的核心,也是很多人使用“容器”这个词语的指代对象。容器引擎能够创建和运行容器,而容器的定义一般是以文本方式保存的,比如 Dockerfile。
云提供商(国外篇):
容器飞速发展的时候,很多公司反应迅速,都相继推出了自己的公有云或者私有云的容器解决方案。国外比较有名的容器云提供商,比如,Amazon EC2 Container Serveice (ECS):云计算巨头 AWS 推出的容器服务,比较吸引人的是构建在 EC2 上面的 ECS 是免费的,用户只需要为底层的 EC2 资源付费。
云提供商(国内篇):
每次新技术的出现都会催生一堆公司,有大公司也有创业公司。不管是大数据、Iaas、人工智能还是现在的容器。国内公司目前对技术已经非常敏感,追逐和使用新技术的脚步从来没有落后过。虽然现在还没有在核心技术上制定标准和掀起浪潮,但是我相信不久之后中国会出现能够影响世界的技术。
目前国内做容器比较知名的公司,比如,阿里云:作为国内云服务的一哥,阿里云反应迅速,和 docker 建立 官方合作,也开始为自己的容器产品布道。
容器编排系统:
容器与虚拟机相比有个很大的优势就是轻量,这个特性的量变很快就引发了质变,让容器在各个技术角落施展拳脚。不过轻量级的容很容易造成混乱,面对成百上千乃至更多的容器,必须要有统一的管理平台。所以目前容器技术最热烈的激战也在这个领域,所有要使用容器的企业必须要在容器管理系统做出自己的抉择。
容器基础镜像:
容器虽然轻量,但是传统的基础镜像并非如此。因此有很多企业尝试着打造专门为容器而生的操作系统,希望能成为容器时代的新选择。比如,CoreOS:以容器为中心的操作系统,配置管理、自动扩容、安全等方面有一套完整的工具。
镜像registry:
镜像registry是存储镜像的地方,可以方便地在团队、公司或者世界各地分享容器镜像,也是运行容器最基本的基础设施,比如,Docker Registry:Docker 公司提供的开源镜像服务器,也是目前最流行的自建registry的方案。
容器监控:
cAdvisor:Google 开源的容器使用率和性能监控工具
Datadog Docker:能够收集 docker 的运行信息,并发送到 Datadog 进行分析。
NewRelic Docker:收集 docker 的运行信息,并发送到 NewRelic 进行分析。
Sysdig:同时提供开源版本和企业版本,能够监控容器使用率和性能,并对性能就行分析。
网络:
容器的大规模使用,也对网络提供了更高的要求。网络的不灵活也是很多企业的短板,目前也有很多公司和项目在尝试解决这些问题,希望提出容器时代的网络方案。比如:
Weave Net:weaveworks给出的网络的方案,使用vxlan技术, 支持网络的隔离和安全。
服务发现:
容器和微服务的结合创造了另外的热潮,也让服务发现成功了热门名词。可以轻松扩展微服务的同时,也要有工具来实现服务之间相互发现的需求。目前主要有三种工具,当然它们可能已经集成到其他的容器管理系统中。比如:
etcd:CoreOS 开源的分布式 key-value 存储,通过 HTTP 协议提供服务,因此使用起来简单。但是 etcd只是一个key-value存储,默认不支持服务发现,需要三方工具来集成。kubernetes 默认就使用 etcd 作为存储。