睡眠不止一种方法:深入研究各种恶意软件家族的 API Hammering 实现

执行摘要

Unit 42 发现了 Zloader 和 BazarLoader 样本,它们具有沙盒规避技术的有趣实现。这篇博文将详细介绍 API Hammering 在这些类型的恶意软件中的独特实现。API Hammering 涉及使用对 Windows API 的大量调用作为扩展睡眠的一种形式,以逃避沙盒环境中的检测。
沙盒是一种流行的技术,用于检测样本是否是恶意的。沙盒分析二进制文件在受控环境中执行时的行为。沙盒在分析大量计算资源有限的二进制文件时必须应对许多挑战。恶意软件有时会通过在沙箱中“休眠”来滥用这些挑战,然后再执行恶意程序以隐藏其真实意图。
Palo Alto Networks 客户通过Cortex XDR或具有WildFire威胁预防安全订阅的下一代防火墙,使用规避技术从恶意软件系列中获得保护。

恶意软件休眠的常见方式

恶意软件最常见的休眠方式是简单地调用 Windows API 函数Sleep。我们经常看到的一种偷偷摸摸的方式是Ping Sleep技术,恶意软件在循环中不断地将 ICMP 网络数据包发送到 IP 地址 (ping)。发送和接收这些无用的 ping 消息需要一定的时间,因此恶意软件会间接休眠。然而,所有这些方法很容易被许多沙箱检测到。

什么是 API 锤击?

API Hammering是一种已知的沙盒绕过技术,恶意软件作者有时会使用它来规避沙盒。我们最近观察到Zloader - 多种类型恶意软件的释放器 - 以及后门BazarLoader使用新的和独特的 API Hammering 实现来保持隐蔽。
API Hammering 包含大量垃圾 Windows API 函数调用。这些调用的执行时间延迟了恶意软件真正恶意程序的执行。这允许恶意软件在沙盒分析过程中间接休眠。

BazarLoader 中的 API Hammering

BazarLoader的旧变体使用固定数量 (1550) 的printf函数调用来超时恶意软件分析。在分析较新版本的 BazarLoader 时,我们发现了 API Hammering 的新的更复杂的实现。
下面的反编译过程显示了这个新变体是如何在我们分析的 BazarLoader 示例中实现的。它利用了一个随机计数的巨大循环,该循环重复访问 Windows 中的随机注册表项列表:
22.06.24-Unit42 - 睡眠不止一种方法:深入研究各种恶意软件家族的 API Hammering 实现 - 图1
图 1. BazarLoader 中的 API Hammering 循环。
为了生成随机循环计数和注册表项列表,该示例从System32目录中读取与定义的大小匹配的第一个文件。然后对该文件进行编码(参见图 2)以删除其大部分空字节。然后根据该文件中第一个空字节的偏移量计算随机计数。随机注册表项列表是从编码文件中的固定长度块生成的:
22.06.24-Unit42 - 睡眠不止一种方法:深入研究各种恶意软件家族的 API Hammering 实现 - 图2
图 2. 在 BazarLoader 中对选定文件进行编码。
对于不同的 Windows 版本(Windows 7、8 等)和一组不同的应用更新,System32目录中也有一组不同的文件。这会导致 BazarLoader 在不同机器上执行时使用的循环计数和列表注册表项不同。
API Hammering 函数位于 BazarLoader 示例的打包程序中(参见图 3)。它延迟了有效载荷解包过程以逃避上述检测。如果不完成解包过程,BazarLoader 示例似乎只是在访问随机注册表项,这种行为也可以在许多合法类型的软件中看到:
22.06.24-Unit42 - 睡眠不止一种方法:深入研究各种恶意软件家族的 API Hammering 实现 - 图3
图 3. API Hammering 延迟 BazarLoader 中的解包过程。

Zloader 中的 API Hammering

虽然 BazarLoader 示例依赖循环来执行 API Hammering,但 Zloader 使用了不同的方法。它不需要一个巨大的循环,而是由 4 个大函数组成,其中包含对多个其他较小函数的嵌套调用(参见图 4):
22.06.24-Unit42 - 睡眠不止一种方法:深入研究各种恶意软件家族的 API Hammering 实现 - 图4
图 4. ZLoader 中负责 API Hammering 的大型函数之一。
每个小程序内部都有四个与文件 I/O 相关的 API 函数调用。这些函数是GetFileAttributesW、ReadFile、CreateFileW和WriteFile(参见图 5):
22.06.24-Unit42 - 睡眠不止一种方法:深入研究各种恶意软件家族的 API Hammering 实现 - 图5
图 5. ZLoader 中负责 API Hammering 的小函数之一。
通过使用调试器,我们可以计算出对四个文件 I/O 函数的调用次数(参见图 6)。大型和小型函数总共生成超过一百万个函数调用,而无需使用 BazarLoader 中看到的单个大型循环:
22.06.24-Unit42 - 睡眠不止一种方法:深入研究各种恶意软件家族的 API Hammering 实现 - 图6
图 6. 负责 ZLoader 中 API Hammering 的 API 的调试器日志。
下表显示了我们分析过程中的 API 函数调用计数:

输入输出接口函数 总调用次数
ReadFile 278,850
WriteFile 280,921
GetFileAttributesW 113,389
CreateFileW 559,771

表 1. API 函数调用计数。
四大函数的执行时间延迟了Zloader payload的注入。如果不完整执行这些函数,该示例将看起来是一个仅执行文件 I/O 操作的良性示例。
以下反汇编代码显示了四个 API 锤击程序,然后是注入程序:
22.06.24-Unit42 - 睡眠不止一种方法:深入研究各种恶意软件家族的 API Hammering 实现 - 图7
图 6. 在 ZLoader 中注入有效负载之前的 API Hammering。

结论:WildFire vs API Hammering

分析 API Hammering 的各种实现的结果支持使用 API Hammering 检测恶意软件样本,以在WildFire中规避沙盒。WildFire 检测到 BazarLoader、Zloader 和其他恶意软件系列对 API Hammering 的使用。
以下来自我们 BazarLoader 示例的 WildFire 报告的摘录显示了检测到的 API Hammering 条目:
22.06.24-Unit42 - 睡眠不止一种方法:深入研究各种恶意软件家族的 API Hammering 实现 - 图8
图 7. WildFire 在 Bazarloader 示例中检测到 API Hammering 以及其他行为。
Palo Alto Networks 客户通过 Cortex XDR 或我们的下一代防火墙以及 WildFire 和威胁预防安全订阅,使用类似的沙盒规避技术获得针对其他恶意软件系列的进一步保护。

IoCs

BazarLoader

ce5ee2fd8aa4acda24baf6221b5de66220172da0eb312705936adc5b164cc052

Zloader

44ede6e1b9be1c013f13d82645f7a9cff7d92b267778f19b46aa5c1f7fa3c10b