Implant.ARM.iLOBleed.a恶意软件分析
在本节中,我们将对 HP iLO 固件中发现的植入程序进行技术分析。
当我们的安全分析团队发现恶意软件时,攻击者决定擦除服务器的磁盘并完全隐藏他们的踪迹。有趣的是,攻击者并会不断擦除痕迹,他们将恶意软件设置为每隔一段时间重复执行数据擦除。也许他们认为,如果系统管理员重新安装操作系统,整个硬盘会在一段时间后再次被擦除。显然,他们不认为他们的恶意软件会被发现。
但与其他“wiper”恶意软件不同,这不是一次性恶意软件。它旨在长时间保持在雷达之下。此恶意软件的重要功能之一是操纵 iLO 固件升级例程,因此如果系统管理员尝试将 iLO 固件升级到新版本,恶意软件会在阻止升级例程的同时模拟版本更改。为此,恶意软件会假装升级成功,并提供所有正确的消息和日志。甚至固件版本的确切数量也被提取并显示在 Web 控制台和其他位置的适当位置,尽管实际上并未执行升级。
这就表明,该恶意软件的目的是成为具有最大隐蔽性并躲避所有安全检查的 rootkit。一种恶意软件,通过隐藏在最强大的处理资源之一(始终打开)中,能够执行从攻击者那里收到的任何命令,而不会被检测到。
很自然,执行的此类攻击属于 APT 类别。但是,使用如此强大且成本高昂的恶意软件来破坏数据,增加恶意软件被检测到的可能性的任务对于这些攻击者来说似乎是一个明显的错误。
iLO 转储实用程序
检查固件感染的第一步是准备一个副本或检查所谓的固件转储。
不幸的是,HP没有提供一个工具或方法来测试和读取iLO固件。为此,编写了一个固件转储工具被提上了日程,最终演变成了Padvish iLO Scanner工具,并演变为两个版本:
从主机操作系统内部扫描:如前所述,iLO 固件可通过安装在系统上的主处理器和操作系统作为 PCI-Express 卡使用。 HP 为各种操作系统引入了一个名为 flash_ilo 的工具,以允许将固件更新到较新的版本。但是,此工具只允许你写入固件,而不允许你读取现有固件。为此,基于在 iLO 上获得的知识,我们能够开发一种工具来读取固件并从中创建转储。
通过iLO网口进行扫描:由于通过主机操作系统进行扫描可能并不总是可行,而且网络管理员可能很难在生产服务器上执行扫描,或者很难进行大量扫描,因此考虑了另一种扫描固件的方法。此版本的扫描器允许转储固件,方法是使用先前 iLO 版本上的一些已知漏洞,使其能够在易受攻击的固件上远程执行代码。由于使用漏洞,该版本只能转储2.30到2.50范围内的HP iLO4固件。
受感染的固件分析
制作服务器固件副本后,应将其与原始固件版本进行比较。 Implant.ARM.iLOBleed.a 恶意软件基于 iLO 固件 2.30 版。因此,该受感染版本与原始版本之间的差异如下图所示。
固件签名差异:(上)获得的受感染转储,(下)惠普公司提供的原件
仔细观察,还比较了文件系统级的两个固件组件和模块,如下表所示。
比较受感染系统固件模块与原始版本的签名
如该表所示,在构成 hpimage.bin 的所有模块中,只有 hpimage标头文件和引导加载程序标头文件两部分是相同的。在其他部分中,签名中的差异表明这两个文件在这些部分之间存在差异。也可以看出,大部分变化都与ELF.bin模块有关,而其他模块只有2到12个字节的变化。
重启后持久化
任何类型的恶意软件的开发人员担心的一个问题是,在恶意软件最初进入系统后,系统必须“保持”受感染状态。
正如我们之前在“iLO 固件结构”一节中详细介绍的,在 iLO 启动过程中,bootloader 模块负责验证操作系统内核的签名,而系统的内核负责验证用户模式模块的签名。因此,如果攻击者想要在 iLO 固件上创建后门,除了插入后门(基本上在 ELF.bin 文件中完成)之外,就必须在操作系统内核中禁用验证机制,从而在引导加载程序中禁用验证机制。
禁用操作系统内核和用户模式模块的验证过程
上图简要描述了绕过操作系统内核和用户模式模块验证过程的过程:攻击者通过逆向工程提取 bootloader.bin、kernel.bin 和 ELF.bin 三个主要部分后,查找在引导加载程序和内核中执行签名验证和验证操作的函数的地址,并将它们替换为 NOP 命令。最后,将修改后的文件组合在一起形成一个完整的 HP Image 文件,并作为新固件写入 SPI 闪存。重启后,可以看到被感染的固件加载后门没有任何问题。
恶意软件模块分析
引导加载程序部分
如表 2 所示,Boot Loader 与原始固件相比更改了 5 个字节。对这些字节的详细分析表明,这种差异是由于负责验证操作系统内核的功能发生了变化,并且正在通过替换 NOP 命令禁用此过程。
禁用 Bootloader 中的签名验证功能
内核部分
如表 2 所示,内核从原始固件更改了 12 个字节。对这一变化的更详细分析表明,这种差异是由于负责验证 UserLand 签名并通过替换 3 个 NOP 命令禁用此过程的功能发生了变化。
禁用内核中的签名验证功能
UserLand 部分
提取受感染固件的 UserLand 部分并将其内容与原始版本进行比较,表明删除了一个文件(sectionInfo)并添加了一个新模块(称为 newELF,包含 17 个单独的部分)。此外,除了添加新的恶意软件模块外,原始版本中的许多模块也发生了变化。
受感染系统硬件中的修改文件
在本节中,将该恶意软件中原始版本的模块与修改后的模块进行比较,结果如下表所示。
带有 NewELF 的 iLO 版本与原始版本的比较
恶意软件工件
Implant.ARM.iLOBleed.a 恶意软件在 iLO(也称为 NAND 闪存)的工作区存储中创建 3 个文件。这些文件的路径甚至名称似乎都可以通过配置器模块进行配置。在我们获得的恶意软件样本中,这三个文件分别命名为 lifesignal.bin、schedule.bin 和 fakefwdata.bin。
恶意软件使用的三个文件
如果系统管理员尝试升级其服务器的固件版本,恶意软件会在阻止和模拟固件升级操作以欺骗系统管理员的同时,在 fakefwdata.bin 文件中输入此操作的信息。
如其名称所示,schedule.bin文件用于调度磁盘擦除操作。在这个文件中,存储了两个4字节的整数:一个计数器和一个日期纪元。前4个字节的数字(计数器)被设置为一个初始值,并在每次执行磁盘擦除过程时减少1。此操作按周期重复,直到计数器为零。第二个数字(日期)表示磁盘擦除进程的开始日期。
文件 schedule.bin 的内容
“newELF”模块内部
这个模块是一个完整的ELF,添加到Boottable的末尾,增加一个单元的进程数。此 ELF 与此固件中的其他 ELF 一样,由几个基本组件组成。第一部分是 NewELF.ELF.Initial.text,与其他 ELF 不同,它不是空的,并且包含代码。仔细观察会发现,该部分与 ConAppCLI.ELF.text 非常相似,后者是 iLO 硬件的主要模块之一。表 5 显示了这两个模块之间的一般比较,显示了它们的差异。这些相似之处表明 Implant.ARM.iLOBleed.a 恶意软件的基本结构是基于 ConAppCLi 模块的功能。
ConAppCLI.ELF.text 和 NewELF.ELF.Initial.text 之间的比较
恶意软件的另一个基本部分是 NewELF.ELF.text,下图显示了该恶意软件的主要功能。该函数的主要任务之一是设置一个确定恶意软件操作主要参数的数据结构,其中一部分已如上图所示。在该函数的开头,schedule.bin文件的地址为复制到一个变量,指向这个地址的指针复制到数据结构的0x0c地址。
恶意软件的主要函数
接下来,在另一个名为 initOperationConfigFiles 的函数中,检查恶意软件所需文件的状态。在这个函数中,首先创建lifesignal.bin文件,然后满足以下条件:
如果 schedule.bin 文件存在并且具有有效的结构,则其内容将被复制到数据结构的地址 0 到 0x07,并且值 0x3 将写入 lifesignal.bin 文件。
如果相关地址中不存在 schedule.bin 文件,则会创建并填充初始值。之后,数据结构就被完全填满了。
如果 schedule.bin 文件的结构无效,则会在 lifesignal.bin 文件中写入 0x9。
恶意软件运行参数的数据结构
如前所述,schedule.bin 文件由两个 4 字节的数字组成。在操作开始时,在initOperationConfigFiles 函数中,计数器编号设置为maxOperationCount(地址0x24 数据结构),日期编号设置为所需的时间和命令执行的日期。在恶意软件的一个样本中,重复操作的最大值设置为 0x2,而在另一个样本中设置为 0x3e8(相当于 1000 次)。
在检查了执行擦除操作的适当条件后,该操作将在 startPeriodicOperation 函数中开始。此函数在第一步中创建并填充具有最大操作长度的数据结构数组。这些数据结构中的每一个都使用不同的执行时间值进行评估。该设置使得恶意软件在初始等待时间(例如 36 小时)的基础上增加了各种操作周期(例如 12 小时)的倍数,并将该值记录在每个数据结构的 0x1C 地址处。在这种情况下,操作在从 schedule.bin 文件中记录的时间开始的等待时间(36 小时)之后开始,并在每个周期重复。最后调用 startWipeOperation 函数,执行磁盘擦除操作。
startPeriodicOperation 的函数体
startWipeOperation 函数在循环中执行擦除操作,如下图所示。在此循环开始时,名为 GetAndValidateOperationParameters 的函数检查操作参数的准确性并计算剩余的操作数。实际上,在名为SuccessfulOperationCount 的变量中执行的操作数被提取并检查,以便获得的数不超过计数器的最大值。
startWipeOperation 的函数体
下一个函数是 WaitForNextOperationTarget 函数,其内容如下图所示。该函数的职责是在主循环中创建中断,直到到达下一个操作时间。在指定的时间,此函数退出其循环,操作的主循环继续操作。
WaitForNextOperationTarget 的函数体
在主循环的下一部分中,执行擦除磁盘操作并完全擦除服务器的硬盘。擦除操作完成后,schedule.bin 文件由 DecrementOperationCount 函数更新,并减少一个计数器。 DecrementOperationCount 函数的主体如下图所示。
DecrementOperationCount 的函数体
修改后的模块分析
该恶意软件包含一些 iLO 模块的修改版本,其中一些模块被修改以防止原始函数或以其他方式更改它。恶意软件中有 6 个修改后的模块,如下所示:
恶意软件修改模块
总结
固件安全近年来已经成为IT安全中的一个重要问题,但在实际应用中还没有得到足够的重视。由于 HP iLO 管理工具具有的功能和高级别的访问权限,它需要特殊的保护方法。不幸的是,由于缺乏工具和信息以及 iLO 技术的专有性质,许多安全研究人员无法研究这些系统。更糟糕的是,尽管安全研究人员过去发表的研究已经证明了恶意软件嵌入软件的可能性,但仍然没有公开可用的解决方案来检测感染并在感染发生时将其阻止。
另一个重点是,有一些方法可以通过网络和主机操作系统访问和感染 iLO。这意味着即使 iLO 网线完全断开,仍然存在感染恶意软件的可能。有趣的是,如果不需要 iLO,则无法完全关闭或禁用 iLO。
这些问题表明需要采取预防性安全措施来提高固件的安全性,例如更新到制造商提供的最新版本、更改管理员密码以及将 iLO 网络与操作网络隔离,最后,定期监测固件的安全参数和潜在感染状态。
保护建议
请勿将 iLO 网络接口连接到操作网络并临时搭建一个完全独立的网络;
定期将 iLO 固件版本更新到 HP 的最新官方版本;
在HP服务器上执行iLO安全设置,并禁用 G10 服务器的降级;
使用纵深防御策略降低风险并在到达 iLO 之前检测潜在的攻击;
定期使用 iLO Scanner 工具检测当前版本的 iLO 服务器固件中的潜在漏洞、恶意软件和后门
本文翻译自:https://threats.amnpardaz.com/en/2021/12/28/implant-arm-ilobleed-a/如若转载,请注明原文地址