2019年9月至12月研究人员定期扫描和收集互联网中Docker的元数据,研究发现攻击者针对Docker的攻击策略和技术,并发现1400个不安全的Docker主机、8673个活动容器和17927个Docker镜像。
Docker技术在过去几年中普及率极大提高,在这项技术迅速发展普及的同时也成为攻击者的主要目标。大多数恶意活动都涉及到加密劫持(主要是针对Monero的挖掘),但一些受损的Docker会被用来发动其他攻击或在其主机上安装rootkit。攻击者还会从公开的日志中找到敏感信息,如应用程序凭据和基础结构配置。攻击者将整个主机文件系统装载到一个容器中,并从该容器访问主机操作系统(OS)进行读/写。
观察到的恶意活动分为以下四类:
1、使用恶意代码部署容器镜像
恶意镜像首先被推送到公共注册中心,然后将镜像提取并部署到不安全的Docker主机上。
2、部署良性容器镜像并在运行时下载恶意负载。
在Docker主机上部署良性镜像,然后下载恶意有效负载并在良性容器中执行。
3、在主机上部署恶意负载
将整个主机文件系统装载到容器中,并从容器访问主机文件系统。
4、从Docker日志中获取敏感信息
抓取Docker日志以查找敏感信息,如凭据和配置。
守护进程一直在后台运行,它管理单个主机上的容器,运行时会管理Docker对象,如图像、容器、网络和存储。应用程序或用户通常使用Docker客户端来验证Docker守护进程并与之交互。如果有多个主机作为服务或集群,Docker守护进程也可以与其他Docker守护进程通信。
默认情况下,Docker守护进程在/var/run/Docker.sock创建一个非联网的Unix域套接字,只有具有root权限或Docker组成员资格的进程才能访问它。如果客户端需要远程访问Docker守护进程,Docker守护进程可以打开TCP套接字,并在2375端口上列出REST API请求。还可以配置与TLS的相互身份验证以保护客户端和远程守护程序之间的通信。然而,TLS配置可能很复杂,用户有时会出错,并无意中将未经身份验证的守护进程暴露在互联网上。
由于建立TLS十分复杂,研究人员在互联网上发现许多错误配置的和不安全的守护程序。有些Docker守护进程没有加密或身份验证,有的配置了TLS的Docker守护程序,但守护程序无法验证客户端证书。如果不验证客户端证书,任何人都可以建立到守护进程的加密但未经验证的连接。攻击者找到这些不安全的Docker守护进程就可以完全控制Docker平台,并执行诸如部署新容器、登录到任何活动容器以及下载容器镜像等操作。由于Docker守护进程以root权限运行,攻击者还可能获得对主机的完全控制。
为了了解攻击者在不安全Docker主机上使用的策略和技术,研究人员定期扫描internet上公开的Docker守护进程,并在2019年9月至12月期间收集它们的元数据。期间发现大约5000个Docker守护程序暴露在互联网上,其中10-15%的守护程序可以在没有身份验证的情况下访问。研究人员通过只读请求从不安全的主机收集元数据,如表1所示。
总体而言,确定了1400多个唯一的不安全Docker主机、8673个活动容器、17927个Docker镜像和15229个卷。图2显示了Docker守护进程的位置分布。图3显示了他们的Docker版本和操作系统类型。
每个Docker镜像包都有运行应用程序所需的依赖项。因此,应用程序可以在任何平台、操作系统和基础结构上以相同的方式运行,恶意应用程序也可以以同样的方式部署。攻击者使用Docker Hub和Quay等公共容器注册中心来存储和传递恶意容器镜像。由于Docker Hub是大多数Docker主机的默认注册表,因此经常用于存储和传递恶意镜像。这些恶意软件被作为容器直接安装并运行在受损主机上,它们通常只是窃取CPU、内存或网络资源,而不会损害同一主机上的其他容器或进程。由于恶意代码内置在容器镜像中,因此分析工具通常可以在镜像部署之前识别出恶意文件。已在Docker Hub上发现了大量包含恶意代码的镜像,如表2所示。
容器启动后其文件系统和活动进程通常保持不变。但如果没有安全策略(如AppArmor或SELinux)来限制文件系统访问,攻击者可以在运行时在容器中安装和执行恶意有效负载。分析工具擅长识别容器镜像中的恶意代码,但它们看不到在运行时安装的恶意有效负载。攻击者可以从Docker Hub部署经过验证的官方镜像,并在安装运行后向容器中注入恶意进程。
在图4中,一个恶意脚本被下载并在一个官方的Ubuntu镜像中执行。在图5中,下载了两个恶意脚本,并通过Alpine镜像在主机文件系统上运行。图6显示了一个base64编码的脚本通过Busybox镜像添加到主机的crontab中。
不安全的Docker守护进程允许攻击者访问所有容器和镜像,但守护进程不直接提供对主机操作系统的访问。通常是攻击者将整个主机文件系统装载到一个容器并从容器访问主机操作系统。当装载整个主机文件系统时,主机上的几乎所有文件都可以从容器中读/写。
在图7中,攻击者创建了一个容器,该容器将整个主机文件系统(/)装载到容器文件系统(/mnt)。图8显示了如何从容器中对主机文件系统执行恶意负载。chroot命令将调用进程的根目录更改为/mnt,指向主机文件系统的根目录。chroot完成后,恶意进程实际上在主机文件系统上运行。
图9-11显示了使用挂载文件系统攻击主机的技术。在图9中,攻击者通过向容器中的主机挂载点(/mnt)发送恶意负载,在主机上创建了一个恶意cron作业。在图10中,在主机上的根目录中添加了一个新的公钥。此密钥支持对主机操作系统ssh访问。在图11中,下载恶意代码并通过挂载点放到主机引导过程目录rc3.d中。
默认情况下,Docker守护进程维护从创建到终止的每个容器的事件和日志。日志对于调试和审计至关重要,但配置和凭据之类的敏感信息也可能从日志中泄漏。
在图12和图13中,从命令日志中显示了应用程序密码。在图14中,etcd服务器的IP和关键文件的位置从命令日志中泄漏。
在整个研究过程中发现一组网站,这些网站经常被用来传递恶意负载或从受损主机接收数据。这些域名大多允许用户匿名上传和下载文件。
这项研究深入研究了攻击者在攻击Docker平台时使用的策略和技术,还了解了检测和防止这些活动的措施。大多数漏洞是由于将不安全的Docker守护进程暴露到internet,因此防御策略包括:
在Docker守护进程套接字上配置TLS时始终强制相互身份验证
使用Unix套接字在本地与Docker守护进程通信,或使用SSH连接到远程Docker守护进程
只允许客户端IP白名单访问Docker服务器
在Docker中启用内容信任,只能提取经过签名和验证的镜像
扫描每个容器镜像以查找漏洞和恶意代码。
部署保护工具以监视正在运行的容器。
*参考来源:unit42,由Kriston编译,转载请注明来自FreeBuf.COM