Rootkit 是植入操作系统最深处的恶意软件。尽管在纸面上它们似乎对攻击者很有吸引力,但创建它们会带来重大的技术挑战,并且最轻微的编程错误都有可能使受害计算机完全崩溃。在对 2022 年的 APT 预测中,我们注意到尽管存在这些风险,但预计会有更多的攻击者达到开发此类工具所需的复杂程度。嵌入在如此低级别的操作系统中的恶意软件的主要吸引力之一是,它极难被检测到,而且在固件rootkit的情况下,即使重新安装操作系统或用户完全更换了计算机的硬盘驱动器,也会确保计算机保持在感染状态。
在本文中,我们会介绍一个名为 CosmicStrand 的 UEFI 固件 rootkit。
受影响的设备
虽然我们无法发现受害计算机最初是如何被感染的,但对其硬件的分析揭示了 CosmicStrand 可以感染的设备。 rootkit 位于技嘉或华硕主板的固件映像中,我们注意到所有这些映像都与使用 H81 芯片组的设计有关。这表明可能存在允许攻击者将其 rootkit 注入固件映像的常见漏洞。
在这些固件映像中,对 CSMCORE DXE 驱动程序进行了修改,其入口点已被修补以重定向到 .reloc 部分中添加的代码。此代码在系统启动期间执行,会触发一个长执行链,从而导致在 Windows 中下载和部署恶意组件。
查看我们能够获得的各种固件映像,我们评估这些修改可能是使用自动修补程序执行的。如果是这样,则攻击者可以事先访问受害者的计算机,以提取、修改和覆盖主板的固件。这可以通过已经部署在计算机或物理访问上的预先植入的恶意软件来实现。
感染过程概述
在深入了解组成这个 rootkit 的各种组件之前,我们想提供一个关于它试图完成的任务的高级视图。此执行链的目标是在每次启动时从受感染的 UEFI 组件开始将内核级植入部署到 Windows 系统中。
UEFI 恶意软件开发者面临一个独特的技术挑战:他们的植入程序在启动过程中很早就开始运行,以至于操作系统(在本例中为 Windows)甚至还没有加载到内存中。到那时,UEFI执行上下文已经终止了。rootkit完成的主要任务是找到一种方法,将恶意代码一路传递到各个启动阶段。
工作流程包括连续设置挂钩,允许恶意代码持续存在,直到操作系统启动之后。所涉及的步骤是:
初始受感染的固件引导整个链。
该恶意软件在启动管理器中设置了一个恶意挂钩,允许它在执行之前修改 Windows 的内核加载程序。
通过篡改操作系统加载程序,攻击者能够在 Windows 内核的功能中设置另一个挂钩。
当稍后在操作系统的正常启动过程中调用该函数时,恶意软件最后一次控制了执行流程。
它在内存中部署一个 shellcode 并联系 C2 服务器以检索实际的恶意有效负载以在受害者的计算机上运行。
下图中总结了这些步骤:
UEFI 植入
在确定了恶意软件植入的目的之后,我们现在可以更详细地了解这些步骤是如何执行的。
整个执行链从 EFI 驱动程序开始,它似乎是一个名为 CSMCORE 的合法版本的补丁版本(旨在促进通过 MBR 在传统模式下启动计算机),其中攻击者修改了指向 HandleProtocol 启动服务函数的指针。每次调用此函数时,都会将执行重定向到攻击者提供的代码,该代码试图确定调用它的组件(它正在寻找要感染的特定组件——efi)。通过检查函数参数以及位于返回地址的字节,CosmicStrand 可以识别它正在寻找的确切“调用”。
之所以选择执行中的这个特定点,是因为在这个阶段,引导管理器已经加载到内存中,但还没有运行。CosmicStrand抓住了这个机会来修补它的Archpx64TransferTo64BitApplicationAsm中的一些字节。
该函数稍后在正常的操作系统启动过程中被调用也是在一个关键时刻:那时 Windows 操作系统加载程序也存在于内存中,并且可以反过来进行修改。
当它运行时,Archpx64TransferTo64BitApplicationAsm 通过查找特定的字节模式从 OS 加载器 (OslArchTransferToKernel) 中定位一个函数。 然后CosmicStrand 在它的末端添加一个挂钩。
OslArchTransferToKernel 在执行从 Windows 加载程序转移到 Windows 内核之前被调用,这使其成为此类 rootkit 的传统挂钩点。
在 Windows 内核有机会运行之前,CosmicStrand 在 ZwCreateSection 中设置了另一个挂钩。 恶意代码被复制到内存中的ntoskrnl.exe的映像中,并且ZwCreateSection的第一个字节被重写以重定向到它。我们注意到,攻击者小心翼翼地将恶意代码放在ntoskrnl.exe的.text部分的空闲空间中,这使得这种重定向在可能的安全产品眼中不那么显眼。
此时,CosmicStrand 似乎还试图禁用 PatchGuard,这是一种用于防止修改内存中 Windows 内核的关键结构的安全机制。为此,它会定位 ntoskrnl.exe 的 KiFilterFiberContext 函数并对其进行修改,使其无需执行任何工作即可返回。值得注意的是,该函数的本地化也是通过搜索硬编码模式来实现的,非常详尽,甚至包含与 2016 年 8 月发布的 Redstone 1 对应的模式。
然后,Windows内核启动,并在正常运行时调用挂钩的ZwCreateSection函数。当这种情况发生时,CosmicStrand会再次获得执行的控制权,并在运行更多恶意代码之前恢复原始代码。
ZwCreateSection 挂钩的主要目的是收集内核提供的 API 函数的地址,并为下一个组件创建一个导入表。通过使用解析函数,它还在内核地址空间中分配了一个缓冲区,在调用shell代码之前,它在这个地址空间映射shell代码。
内核shellcode
到目前为止描述的所有步骤仅用于将代码执行从 UEFI 传播到 Windows 内核。这个 shellcode 是迄今为止链中第一个真正的恶意组件。它设置了一个线程通知例程,每次创建新线程时都会调用该例程。 CosmicStrand 一直等到 winlogon.exe 出现,然后在这个高权限上下文中执行回调。
这样,CosmicStrand 会休眠 10 分钟并测试受感染计算机的互联网连接。 CosmicStrand 不依赖高级 API 函数来生成网络流量,而是直接与传输设备接口交互:它生成所需的 IRP(I/O 请求数据包)并通过将 IOCTL 发送到TCP 或 UDP 设备对象。DNS请求可以通过谷歌的DNS服务器(8.8.8[.]8)或自定义的DNS服务器(222.222.67[.]208)来实现。
CosmicStrand 通过向其 C2 服务器 update.bokts[.]com 发送自定义的 UDP或 TCP 数据包来检索其最终有效负载。回复预计将返回一个或多个包含 528 字节块的数据包,遵循以下结构:
各种数据块被重新组装成一家族字节,这些字节映射到内核空间并解释为 shellcode。不幸的是,我们无法获得来自 C2 服务器的数据副本。然而,我们确实在我们可以研究的一台受感染计算机上找到了内存中的用户模式样本,并相信它与 CosmicStrand 相关联。该示例是一个可执行文件,它运行命令行以便在受害者的计算机上创建一个用户(“aaaabbbb”)并将其添加到本地管理员组。
我们可以由此推断,从 C2 服务器接收到的 shellcode 可能是攻击者提供的 PE 可执行文件的暂存器,而且很可能存在更多。
较旧的 CosmicStrand 变体
在调查过程中,我们还发现了这个 rootkit 的旧版本。它们具有相同的部署过程,它们的细微差别与内核 shellcode 有关。
它试图从 exe 而不是 winlogon.exe 劫持线程。
为获得额外的 shellcode 以运行而联系的 C2 域是不同的 (erda158[.]to)。
每次在系统中创建新进程时,旧变体都会打印调试消息。
根据我们对这两种变体使用的基础设施的分析,我们估计旧的一种在 2016 年底至 2017 年中期之间使用,而当前的一种在 2020 年曾非常活跃。
基础设施
我们知道有两个C2服务器,每个变体对应一个。根据对他们可用的被动DNS数据,这些域有一个很长的生命周期,并在有限的时间内解析到IP地址,否则,rootkit 将无法运行。因此值得注意的是,虽然攻击者选择部署极其持久的植入程序,但对受害计算机的实际利用可能只有几个月。但是,这些域可能偶尔会在很短的时间内被重新激活,并且此信息不会被被动 DNS 系统记录。
细心的读者会注意到这两个域的活动期之间存在三年的差距。在此期间,攻击者可能正在使用通过 CosmicStrand 部署的用户模式组件控制受害者的计算机,或者更有可能我们还没有发现的其他变体和C2服务器。
受害者
目前,研究人员在中国、越南、伊朗和俄罗斯发现CosmicStrand 的受害者。
总结
综合分析, CosmicStrand 是由说中文的开发者开发的,或者是利用了讲中文的攻击者的资源。具体来说,CosmicStrand中的一些代码模式也在另一个恶意软件家族MyKings僵尸网络中被观察到(例如,MD5 E31C43DD8CB17E9D68C65E645FB3F6E8)。Sophos在2020年记录了这个用于部署加密器的僵尸网络。
与 CosmicStrand 的相似之处包括:
使用 MBR rootkit 在 MyKings 中建立隐秘持久性。
CosmicStrand 和 MyKings 在内核模式(Proc 和 GetM)中分配内存时使用相同的标签。
两个家族都以相同的方式生成网络数据包,并直接利用 UDP 和 TCP 设备对象。
两者使用的 API 哈希码是相同的,如下面的截图所示。据我们所知,这种算法只在另外两个 rootkit 中被发现,即 MoonBounce 和 xTalker。
除了这种代码相似性之外,CosmicStrand 使用的硬编码后备 DNS 服务器位于 CHINANET-BACKBONE (AS4134) 这一事实可能被视为攻击者属于中文网络的一个非常低的置信度的迹象。
CosmicStrand 是一个复杂的 UEFI 固件 rootkit,它允许其所有者实现持久性攻击。
本文翻译自:https://securelist.com/cosmicstrand-uefi-firmware-rootkit/106973/如若转载,请注明原文地址