这不是一个关于 Docker 漏洞的故事;这是一个关于黑客如何寻找不安全的 Docker 部署的故事,他们可以在其中挖掘加密货币。您不应该让您的 Docker 守护进程不安全,就像您不应该让您的邮件服务器不安全一样。
我们听说了许多关于容器环境尝试(有时成功)加密货币挖矿攻击的说法,并决定调查和分析此类攻击的剖析。
虽然不是最恶意的攻击(数据泄露或 DDoS 通常具有更具破坏性的影响),但非法使用云计算资源来挖掘加密货币应被视为挖矿环境安全状况的一大警告信号——因为如果攻击者可以运行一个挖掘比特币的流氓容器,他们可能会运行做更糟糕事情的容器。另一方面,由于硬币挖掘不是最复杂的攻击,因此它在“脚本小子”中相当流行,可用于了解那里使用的方法。
在详细说明发生的事情之前,需要了解一些背景知识。
Docker 守护程序网络访问
Docker 在客户端-服务器架构中工作。守护程序作为服务在后台运行,并负责容器管理。它创建、运行和停止容器,并运行 docker 提供的许多其他功能。
执行 docker 命令会调用一个客户端,该客户端通过 Docker 的 REST API 将请求的命令发送到服务器(docker 守护程序)。
在 Linux 主机上,docker 守护程序侦听它在 /var/run/docker.sock 中创建的 unix 套接字。
为了使守护进程可以通过网络访问和管理,可以将其配置为通过 TCP 套接字公开。默认端口为:
-
端口 2375 用于普通 HTTP 连接
-
端口 2376 用于受信任的 HTTPS 连接
Docker 守护程序将 Windows 主机上的 unix 套接字替换为命名管道。
如果必须公开 Docker 引擎,通常建议将其配置为仅 HTTPS,并强制进行身份验证。
docker 守护程序在未经身份验证的情况下暴露给不受信任的来源会对主机构成重大威胁。
进入蜜罐
攻击者方法有一个共同的目标,即以受害者为目标。他们以不同的方式实现这一目标,通过社会工程进行单一定位,按物理位置进行群体定位,或者使用广域网扫描来查找活动服务等。
研究蜜罐的目标是了解攻击者的目标和方法。这些蜜罐旨在让攻击者相信他们是真正的目标,引诱他们进入并让他们花费尽可能多的时间,而不会意识到这实际上是一个陷阱。
当攻击者处于蜜罐中时,蜜罐会检测并记录活动,这些活动稍后可以进行处理和分析。
我们的设置
为了检查容器攻击面和容器安全态势,我们决定以 docker 守护程序的扫描程序为目标。
如前所述,docker 可以配置为通过 TCP 套接字在网络上公开。我们部署了一个虚拟机,在其上安装 docker 并将其公开给 Internet。
为了监控蜜罐环境,我们在同一虚拟机上部署了 Aqua Enforcer。我们想关注攻击者如何部署容器以运行容器,但实际上并没有运行它,因此我们配置了 Aqua CSP 来阻止容器运行。
从那时起,我们只需要等待并从蜜罐环境中收集所有事件日志和其他相关信息。
大约花了两天时间,我们才注意到有趣的流量 - 有人上钩了。
故事时间
非生产系统,无论是测试环境、开发还是其他系统,往往受到的保护较少。与生产环境、开发人员、QA、售前工程师等相比,接触这些系统的人要多得多,这会导致更大的人为错误风险。另一个因素是,出于实际原因,工程师可能会采用配置快捷方式来简化他们的工作。
人们往往低估了此类系统的安全需求,从而导致潜在的灾难 – 在许多情况下,攻击者能够从较低、不太重要的系统进入公司网络,并进入真正的生产环境。
我们的故事是关于我们 “意外” 暴露的一个系统。
让游戏开始吧,愿赔率永远对您有利!
注意:在这项研究期间,我们发现了一些被用来分发恶意服务的来源。我们联系了相关方以披露这些来源。
奇怪的交通
因此,周末回来,早上喝完咖啡后,我们注意到 Aqua Enforcer 记录了数百项可疑操作。毫无疑问,它们中的许多都是由没有造成任何麻烦的机器人自动创建的。
攻击者试图执行各种 docker 命令来管理映像和容器。经过几个小时的尝试,攻击者似乎就放弃了。
行为分析
攻击者的第一个目标是识别可用的 Docker API 版本。这可以通过调用旧版本的命令轻松完成。响应将指定支持的最低 API 版本:
Handler for GET /v1.16/version returned error: client version 1.16 is too old. Minimum supported API version is 1.24, please upgrade your client to a newer version
攻击者的第一个目标是识别正在运行的 Docker 版本,即调用 docker version 命令。结果将帮助他了解他应该针对的系统,并了解他应该使用的 API 版本。
成功收集有关受害者的信息后,下一步是执行他的计划——通过运行容器在目标主机上运行他的代码。
首先,他必须将他的恶意镜像注入 docker 主机。实现此目的的流行和传统方法是将映像推送到注册表(Docker Hub 是自然位置),然后从受害主机中提取它。
没想到,我们看到的方法有点不同。攻击者使用 docker import 功能进行图像注入。Docker import 可用于通过 path 或 URL 从本地/远程 tar 文件下载镜像。导入的映像的名称包含 “xmr”。XMR 是密码学硬币门罗币的代码,几乎可以用任何计算能力来挖矿。攻击者的目标是利用目标的资源为自己谋取利益。
成功注入图像后,攻击者将开始挖矿。使用 docker CLI 客户端时,通常会调用 docker run 命令。在后台,运行容器(分离模式)会调用两个 REST API 调用:
-
通过 docker create 创建容器实例。结果将授予调用者创建的容器 ID。此 ID 用于操作容器。
-
创建容器后,可以使用容器 ID 通过 docker start 部署容器。
由于我们不允许运行容器,因此攻击者在 docker create 阶段失败。他重复了这些步骤很多次,但没有成功。
攻击者切换了他的方法注入镜像,然后召唤了 docker build 进行救援。与 docker import 类似,docker build 命令可以从 git 存储库/预打包的 tarball/纯文本文件的 URL 创建映像。有人尝试从 tarball URL 构建一个名为“xminer”的镜像。
在多次反复尝试惨败后,攻击者决定使用不同的门罗币矿工 – Minergate 官方图片。不用说,它也失败了。
拜访攻击者
流量的来源表面上来自荷兰的某个地方。
我们的假设是攻击者可能托管其他服务,可能是恶意服务或合法服务,以掩盖他的真实目的。
我们看到一个 Web 服务器在那里运行。根页面包含一个 JavaScript 片段,该片段使用 Coin Hive 平台进行门罗币挖矿。浏览器矿工向使用 WebSockets 协调矿工的 Control Hub 报告。
它看起来像一个针对受害者并利用他们的计算能力的复杂系统。
总结
Docker 守护程序通过将自身暴露给网络来启用其使用,以便可以对其进行远程管理。将 docker 配置为侦听未经身份验证的 HTTP 流量存在风险,因此,一个好的做法是禁止此类连接。
攻击者可以使用此类配置在受害主机上的容器内执行任意代码。
如今,攻击者可以将 docker 作为一项服务进行攻击,以及 HTTP 服务器、邮件服务等服务。
挖掘匿名加密货币如今非常流行,我们观察到的攻击也符合这一趋势。攻击者顽固不化,并尝试了所有已知方法来注入恶意容器,而简单的镜像拉取不起作用。
Aqua CSP 检测并阻止此类异常和不需要的行为,这使我们能够观察和学习各种攻击媒介,同时防止攻击者实现利用计算能力挖掘加密货币的目标。
原文始发于微信公众号(菜鸟小新):加密货币矿工滥用容器:(未遂)攻击剖析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论