BlackLotus:首个绕过安全启动的 UEFI Bootkit(下篇)
· 3 分钟阅读 · @admin

在上篇文章中,我们详细分析了 BlackLotus UEFI Bootkit 的初始部署阶段,包括反调试技术、UAC 绕过以及 Bootkit 文件的释放过程。
本文将继续深入分析已部署 Bootkit 的执行机制,重点关注:
- 恶意 EFI 应用的执行流程
- 安全启动绕过的具体实现
- 恶意内核驱动的加载与保护机制
- HTTP 下载器的通信协议
- Bootkit 的持久化与自我防护
二、Bootkit 运行时分析
2.1 恶意 bootmgfw.efi 分析
BlackLotus 使用自签名的恶意 EFI 应用替换了原始的 bootmgfw.efi 文件,并将原文件重命名为 winload.efi。替换后的启动流程如下图所示:

BlackLotus 针对目标系统是否启用了安全启动采取不同的执行策略:
启用安全启动的场景:
当目标系统启用了安全启动时,安装程序会释放用于绕过安全启动的多个组件。考虑到受害者系统上用于启动的 EFI 应用可能已经修复了相关漏洞,攻击者使用包含漏洞的 bootmgr 等 EFI 应用进行漏洞利用,从而绕过安全启动验证。
在成功绕过安全启动后,Bootkit 会对 bootmgr.efi、bootmgrfw.efi 和 winload.efi 等程序执行 Hook 操作,以便在启动链的不同阶段获得恶意代码执行机会。最终,Bootkit 会解密恶意驱动并将其映射到内存中,修改 disk.sys 的入口点为恶意驱动的入口点。当恶意驱动执行完成后,再跳转回 disk.sys 的原始入口点,从而在不破坏系统启动流程的情况下完成恶意代码注入。
恶意驱动解密内嵌的 PE 文件,并将其注入到系统进程 winlogon.exe 中。
2.1.1 禁用基于虚拟化的安全功能(VBS)
为了绕过基于虚拟化的安全(VBS)对恶意驱动的检测,Bootkit 通过设置 EFI 变量 VbsPolicyDisabled 来禁用该功能。

2.1.2 加载原始 winload.efi
恶意 EFI 应用将原始的 winload.efi(即被重命名的原 bootmgfw.efi)加载到内存中,用于执行正常的操作系统启动流程。

2.1.3 Hook winload.efi 函数
恶意 EFI 应用会 Hook winload.efi 中的关键函数,这些函数用于为恶意驱动分配所需的内存空间。

当 winload.efi 首次调用被 Hook 的函数时,会执行恶意 EFI 程序的 Hook 代码。在 Hook 代码中,程序会判断目标内存区域中的数据是否为 PE 文件。如果不是 PE 文件,则不做任何处理,直接调用原始函数。

当检测到 PE 文件时,程序会进一步判断其 subsystem 字段,确认是否为内核驱动或 EFI 应用。对于 EFI 应用,还会判断是否为 bootmgr.efi。如果不属于这两类,则会检查 PE 文件的资源段中是否包含名为 bootmgr.xsl 或 winload.xsl 的资源。

在 Hook 代码中,只有包含 winload.xsl 或 bootmgr.xsl 资源的 PE 文件才会被进一步处理。函数 install_MmAllocPhy_hook 负责对内存分配函数进行二次 Hook,其实现逻辑与前面的 Hook 代码类似。

2.1.4 解密恶意驱动
恶意驱动以硬编码的加密形式存储在 EFI 应用内部,并使用自定义的解密算法进行解密。解密后的数据被抹去了 PE 文件头(MZ 和 PE 标识),用于防止通过内存 Dump 进行检测。

如果解密后的数据头两个字节为 KH,则表示数据解密成功。随后,程序会 Hook 下一阶段所需的关键函数:
> OslArchTransferToKernel:该函数位于操作系统内核和关键系统驱动已经加载到内存但尚未执行的时刻,是对内核代码或驱动程序进行 Patch 的理想时机。
> BlImgAllocateImageBuffer:该函数用于为恶意驱动分配所需的内存空间。

当 OslArchTransferToKernel 函数执行时,首先会跳转到恶意 EFI 应用的 Hook 代码。在该 Hook 代码中,程序会对内核驱动 disk.sys 进行劫持,将其入口点替换为恶意驱动的入口点。当恶意驱动执行完成后,再跳转回 disk.sys 的原始入口点。
这样做的目的是在系统初始化的早期阶段执行恶意内核驱动,从而避免被后续启动的安全机制检测。

在遍历内核模块的过程中,程序还会对两个驱动文件进行 Patch,使其立即返回而不执行驱动的入口代码。这两个驱动程序分别为:
- WdBoot.sys:Windows Defender ELAM(Early Launch Anti-Malware)驱动程序
- WdFilter.sys:Windows Defender 文件系统过滤驱动程序

2.2 恶意内核驱动分析
当操作系统内核执行 disk.sys 的入口点函数时,由于已安装的 Hook,执行流程会被重定向到恶意驱动的入口点。恶意驱动的主要功能是将 HTTP 下载程序注入到系统进程 winlogon.exe 中。
2.2.1 注入 HTTP 下载程序到 winlogon 进程
系统启动后,恶意驱动会持续监控进程创建事件,等待 winlogon.exe 进程启动,然后将恶意程序注入到该进程中。

在确认不存在内核调试器的情况下,驱动会解密内嵌的恶意程序,并将其注入到 winlogon.exe 进程的地址空间中。随后,通过创建远程线程的方式执行注入的恶意代码。

2.2.2 检测内核调试器
恶意驱动通过查询系统信息类 SystemKernelDebuggerInformation 来判断是否存在内核调试器。只有在确认不存在内核调试器的情况下,才会继续执行恶意代码注入操作。

2.2.3 Bootkit 文件保护机制
为了保护位于 ESP(EFI 系统分区)目录中的 Bootkit 文件不被删除或修改,恶意内核驱动采用了一种简单但有效的保护方法。
恶意驱动会打开所有需要保护的文件,复制并保存它们的文件句柄,并将 HandleFlags 设置为 1,从而保护这些句柄不被其他任意进程关闭。这种方法间接阻止了任何试图删除或修改受保护文件的尝试。

即使受害者使用 ARK(Anti-Rootkit)工具等具有较高权限的安全软件删除了受保护的文件,恶意驱动也会在循环中持续检测文件是否存在。一旦检测到文件被删除,驱动会立即触发系统蓝屏(BSOD),作为另一层保护机制。

2.2.4 与 HTTP 下载程序的通信机制
恶意驱动通过 Section 对象的方式接收来自用户态 HTTP 下载程序的命令并执行。事件对象的命名格式如下:
\BaseNamedObjects\{网卡设备MAC地址}
位于用户态的 HTTP 下载程序将指令写入到 Section 对象中,恶意驱动读取该 Section 对象获取指令并执行相应操作。恶意驱动支持的指令如下:
| 指令 | ASCII 字符 | 描述 |
|---|---|---|
| 0x55 | U | 卸载 Bootkit,删除所有 Bootkit 相关文件 |
| 0x49 | I | 加载并执行任意恶意驱动(包括未签名驱动) |
卸载 Bootkit(指令 U):
当接收到卸载指令时,恶意驱动会删除所有 Bootkit 相关文件,并将 winload.efi 恢复为原始文件名 bootmgfw.efi,从而清除 Bootkit 的所有痕迹。

执行任意驱动(指令 I):
当接收到执行指令时,恶意驱动可以加载并执行任意内核驱动程序,包括没有数字签名的恶意驱动。这为攻击者提供了在受害系统上部署其他恶意模块的能力。

三、ATT&CK 矩阵映射
下表将 BlackLotus 的攻击行为映射到 MITRE ATT&CK 框架:
| 战术(Tactic) | 技术编号(ID) | 技术名称(Name) | 描述(Description) |
|---|---|---|---|
| Resource Development | T1588.005 | Obtain Capabilities: Exploits | 利用 CVE-2022-21894 已知漏洞绕过 UEFI 安全启动 |
| Execution | T1106 | Native API | 使用 Windows 内核 API 函数 |
| T1559 | Inter-Process Communication | 通过 Section 对象与内核层驱动进行通信 | |
| Persistence | T1542.003 | Pre-OS Boot: Bootkit | 将恶意文件部署在 EFI 系统分区(ESP)内,实现持久化执行 |
| Defense Evasion | T1497.001 | Virtualization/Sandbox Evasion: System Checks | 检测 VMware、Sandbox 等虚拟化软件 |
| T1622 | Debugger Evasion | 检测用户态和内核态调试器 | |
| T1014 | Rootkit | 恶意驱动保护 Bootkit 文件不被删除或修改 | |
| T1055.002 | Process Injection: Portable Executable Injection | 内核驱动注入恶意程序到 winlogon.exe 进程 | |
| T1027.009 | Obfuscated Files or Information: Embedded Payloads | 恶意文件使用 AES 加密并嵌入在 EFI 应用内 | |
| T1027.007 | Obfuscated Files or Information: Dynamic API Resolution | 动态解析 Windows API | |
| T1112 | Modify Registry | 修改注册表禁用 HVCI 功能 |
总结
本文深入分析了 BlackLotus UEFI Bootkit 部署后的运行机制,包括:
- 恶意 EFI 应用的执行流程:通过替换
bootmgfw.efi并 Hook 关键启动函数,在操作系统启动早期阶段获得代码执行权限 - 安全启动绕过技术:利用 CVE-2022-21894 漏洞和包含漏洞的合法 EFI 应用绕过安全启动验证
- 恶意驱动加载:通过劫持
disk.sys的入口点,在系统初始化早期加载未签名的恶意驱动 - 自我保护机制:使用文件句柄保护和蓝屏触发机制保护 Bootkit 文件不被删除
- 通信协议:通过 Section 对象实现用户态与内核态的指令通信
BlackLotus 代表了 UEFI Bootkit 技术的新高度,它不仅成功绕过了安全启动机制,还采用了多层防护和隐蔽技术,使其难以被检测和清除。这种攻击技术对系统安全构成了严重威胁,值得安全研究人员和防御者高度关注。
防护建议:
- 及时安装安全补丁,修复 CVE-2022-21894 等已知漏洞
- 启用并正确配置 UEFI 安全启动
- 启用基于虚拟化的安全功能(VBS)和 HVCI
- 定期检查 EFI 系统分区(ESP)中的文件完整性
- 使用具备 UEFI Bootkit 检测能力的安全软件
- 监控系统启动配置(BCD)的异常修改

