绕过安全启动并建立持久性
(资料图片仅供参考)
在本部分中,我们将详细了解 BlackLotus 如何在启用 UEFI Secure Boot 的系统上实现持久性。由于我们将要描述的执行链非常复杂,我们将首先解释基本原理,然后深入了解技术细节。
简而言之,该过程包括两个关键步骤:
利用 CVE-2022-21894 绕过安全启动功能并安装 bootkit。这允许在早期启动阶段任意执行代码,此时平台仍然由固件拥有,UEFI 启动服务功能仍然可用。这使得攻击者可以在没有物理访问权限的情况下,在启用了 UEFI Secure Boot 的设备上做许多不应该做的事情,例如修改仅用于启动服务的 NVRAM 变量。这就是攻击者在下一个步骤中为 bootkit 设置持久性所利用的。通过将自己的 MOK 写入 MokList 来设置持久性,Boot 仅服务 NVRAM 变量。这样,它可以使用合法的 Microsoft-signed shim 加载其自签名(由写入 MokList 的密钥的私钥签名)UEFIbootkit,而不是在每次启动时利用该漏洞。有关这一点的更多信息,请参阅 Bootkit 持久性部分。
为了使下面两部分的分析更容易,研究人员将遵循执行图(下图)中所示的步骤。
利用 CVE-2022-21894
为了绕过安全启动,BlackLotus 使用 baton drop 漏洞(CVE-2022-21894):安全启动安全功能绕过漏洞。尽管这个漏洞对系统安全影响很大,但它并没有得到应有的重视。尽管微软在 2022 年 1 月的更新中修复了该漏洞,但由于受影响的二进制文件仍未添加到 UEFI 取消列表中,因此攻击者仍有可能利用该漏洞。因此,攻击者可以将他们自己的易受攻击的二进制文件副本带到受害者的设备上,以利用此漏洞并绕过最新 UEFI 系统上的安全启动。
此外,自 2022 年 8 月以来,针对该漏洞的概念证明(PoC)漏洞已公开可用。考虑到第一次 BlackLotus VirusTotal 提交的日期,恶意软件开发人员可能只是根据他们的需要调整了可用的 PoC,而不需要深入了解此漏洞的工作原理。
让我们先简单介绍一下该漏洞,主要是与 PoC 一起发布在 GitHub 上的文章中的关键点:
受影响的 Windows 启动应用程序(如 bootmgr.efi、hvloader.efi、winload.efi …)允许在应用程序加载序列化安全启动策略之前,使用 truncatememory BCD 启动选项从内存中删除该策略。
这允许攻击者使用其他危险的 BCD 选项,如 bootdebug、testsigning 或 nointegridchecks,从而破坏安全启动。
有多种方法可以利用此漏洞——其中三种方法已发布在 PoC 存储库中。
例如,其中一个 PoC 显示了如何利用它使合法的 hvloader.efi 加载任意的自签名 mcupdate_
现在,我们继续介绍 BlackLotus 如何利用此漏洞:
1. 安装程序重新启动机器后,UEFI 固件将继续加载第一个启动选项。对于 Windows 系统,默认情况下,第一个启动选项是位于 ESP 上 ESP:/efi/Microsoft/boot 文件夹中的 bootmgfw.efi。这一次,固件没有执行原始受害者的 bootmgfw.efi(安装程序以前将其重命名为 winload.efi),而是执行安装程序部署的易受攻击的启动。
2. 执行 bootmgfw.efi 后,它将加载 BCD 启动选项,该选项先前由安装程序修改。下图显示了合法 BCD 和修改后 BCD 的比较。
3. 如下图所示(路径以绿色划线),合法的 Windows Boot Manager 通常会将 Windows OS 加载程序(Windowssystem32winload.efi)作为默认启动应用程序加载。但这一次,使用修改后的 BCD,它继续加载易受攻击的 ESP:system32bootmgr.efi,避免内存 BCD 元素设置为值 0x10000000,并且 custom:22000023 BCD 指向另一个攻击者存储在 ESP:system32BCD 中的 BCD。
4. 在下一步中,执行的 ESP:system32bootmgr.efi 加载位于 ESP:system32BCD 中的附加 BCD。这个附加 BCD 的解析内容如下图所示。
5. 由于从上图所示的 BCD 文件加载了选项,bootmgr.efi 将继续加载安装程序部署的另一个易受攻击的 Windows 启动应用程序 ESP:system32hvloader.efi,即 Windows Hypervisor Loader。更重要的是,在同一 BCD 文件中指定了其他 BCD 选项:
值设置为 0x10000000 的 truncatememory;
nointegridchecks 设置为 Yes;
testsigning 也设置为 Yes;
此时就会发生意想不到的事情,由于序列化的安全启动策略应该在 0x10000000 以上的物理地址中加载(因为前面步骤中使用了 avoidlowmemory),指定 truncatmemory 元素将有效地删除它。因此,中断安全启动并允许使用危险的 BCD 选项,如 nointegritychecks 或 testsigning。通过使用这些选项,攻击者可以使 hvloader.efi 执行自己的自签名代码。
6. 为此,使用此 PoC 中描述的技巧,即在执行过程中,合法的 hvloader.efi 从
7. 现在,随着攻击者自己的自签名 mcupdate*.dll 被加载和执行,它将继续执行这个链中的最后一个组件——一个嵌入式 MokInstaller (UEFI 应用程序)——参见图 10 了解它是如何完成的。
Bootkit 持久性
现在,MokInstaller 可以继续设置持久性,方法是将攻击者的 MOK 注册到 NVRAM 变量中,并将合法的 Microsoft 签名的 shim 二进制文件设置为默认启动加载程序来继续设置持久性。
shim 是由 Linux 开发人员开发的第一阶段 UEFI 启动加载程序,用于使各种 Linux 发行版与 UEFI Secure Boot 一起工作。它是一个简单的应用程序,其目的是加载、验证和执行另一个应用程序,在 Linux 系统中,它通常是 GRUB 启动加载程序。它的工作方式是,微软只签署一个 shim, shim 负责其余的工作,它可以通过使用 db UEFI 变量中的密钥来验证第二阶段启动加载器的完整性,还可以嵌入自己的 " 允许 " 或 " 取消 " 项或哈希列表,以确保平台和 shim 开发人员(例如 Canonical, RedHat 等)都信任的组件被允许执行。除了这些列表之外,shim 还允许使用用户管理的外部密钥数据库,即 MOK 列表。该 MOK 数据库存储在名为 MokList 的仅启动 NVRAM 变量中。在不利用上述漏洞的情况下,需要物理访问才能在启用 UEFI Secure Boot 的系统上对其进行修改(仅在启动期间,在系统加载程序调用 UEFI 启动服务函数 ExitBootServices 之前可用)。然而,通过利用此漏洞,攻击者能够绕过 UEFI Secure Boot 并在调用 ExitBootServices 之前执行自己的自签名代码,因此他们可以轻松注册自己的密钥(通过修改 MokList NVRAM 变量),使填充程序执行任何应用程序(由该注册密钥签名),而不会导致安全违规。
8.MokInstaller UEFI 应用程序继续为 BlackLotus UEFI bootkit 设置持久性,并通过以下方式覆盖利用痕迹:
8.1 从安装程序创建的备份中恢复受害者的原始 BCD 存储,并将 efi 替换为合法的 microsoft 签名 shim,该 shim 先前由安装程序放置到 ESP:system32bootload.efi 中。
8.2 创建包含攻击者自签名公钥证书的 MokList NVRAM 变量。请注意,此变量的格式与任何其他 UEFI 签名数据库变量(如 db 或 dbx)的格式相同,它可以由零个或多个 EFI_signature_LIST 类型的签名列表组成,如 UEFI 规范中所定义。
8.3 从攻击者的 ESP:system32 文件夹中删除涉及攻击的所有文件。
最后,它会重新启动计算机,使部署的 shim 执行安装程序从 EFIMicrosoftBootgrub64.EFI 中删除自签名 bootkit,grub64.EFI 通常是 x86-64 系统上 shim 执行的默认第二阶段启动加载程序。
BlackLotus UEFI bootkit
一旦配置了持久性,就会在每次系统启动时执行 BlackLotus bootkit。 bootkit 的目标是部署一个内核驱动程序和一个最终的用户模式组件—— HTTP 下载器。在执行过程中,它试图禁用其他 Windows 安全功能——基于虚拟化的安全(VBS)和 Windows Defender ——以提高成功部署和隐形操作的机会。在详细介绍如何实现之前,让我们先了解一下内核驱动程序和 HTTP 下载器的基本知识:
内核驱动程序负责:
部署链的下一个组件— HTTP 下载器;
在被终止运行的情况下保持加载器不被关闭;
防止从 ESP 中删除 bootkit 文件;
如果 HTTP 下载器指示的话,执行额外的内核有效负载;
根据 HTTP 下载器的指示,卸载 bootkit。
HTTP 下载器负责:
与 C&C 通信;
执行从 C&C 收到的命令;
下载并执行从 C&C 接收到的有效负载(支持内核有效负载和用户模式有效负载)。
从安装程序到 HTTP 下载器的完整执行流程(简化后)如下图所示。我们将在下一节中更详细地描述这些步骤。
BlackLotus 执行流程
执行步骤如下(这些步骤如下图所示):
1.UEFI 固件执行默认的 Windows 启动选项,该选项通常存储在 EFIMicrosoftbootbootmgfw.EFI 中的文件。正上所述,MokInstaller 二进制文件用一个合法的签名 shim 替换了这个文件。
2. 执行 shim 时,它读取 MokList NVRAM 变量,并使用攻击者先前存储在其中的证书来验证第二阶段启动加载程序——位于 EFIMicrosoftBootgrubx64.efi 中的自签名 BlackLotus UEFI 启动程序。
3. 验证后,shim 执行 bootkit。
4.bootkit 从创建仅启动 VbsPolicyDisable NVRAM 变量开始。如本文所述,此变量在启动期间由 Windows OS 加载程序评估,如果已定义,则不会初始化核心 VBS 功能,如 HVCI 和凭据保护。
5. 在以下步骤中,bootkit 继续使用 UEFIbootkit 使用的通用模式。它拦截典型 Windows 启动流中包含的组件的执行,例如 Windows 启动管理器、Windows OS 加载器和 Windows OS 内核,并将它们的一些功能挂钩到内存中。另外,它还尝试通过修复某些驱程序来禁用 Windows Defender。所有这些都是为了在系统启动过程的早期阶段实现有效负载的执行,并避免检测。以下函数已挂钩或修复:
5.1 bootmgfw.efi 或 bootmgr.efi 中的 ImgArchStartBootApplication:该函数通常由 bootkit 挂钩,以捕捉 Windows OS 加载程序(winload.efi)加载到内存中但尚未执行的时刻——这是执行更多内存修复的正确时刻。
5.2 winload.efi 中的 BlImgAllocateImageBuffer:用于为恶意内核驱动程序分配额外的内存缓冲区。
5.3 winload.efi 中的 OslArchTransferToKernel:连接以捕捉系统内核和某些系统驱动程序已加载到内存中但尚未执行的时刻,这是执行更多内存修复的最佳时刻。下面提到的驱动程序在此挂钩中进行了修复。下图显示了这个挂钩中负责在内存中查找适当驱动程序的代码。
5.4 WdBoot.sys 和 WdFilter.sys:BlackLotus 修复了 WdBoot.sys 和 WdFilter.sys(分别是 Windows Defender ELAM 驱动程序和 Windows Defender 文件系统筛选器驱动程序)的入口点,以立即返回。
5.5 disk.sys:bootkit 将 disk.sys 驱动程序的入口点挂钩,以便在系统初始化的早期阶段执行 BlackLotus 内核驱动程序。
6. 接下来,当系统内核执行 disk.sys 驱动程序的入口点时,已安装的挂钩会跳转到恶意内核驱动程序入口点。恶意代码反过来恢复原始 disk.sys 以使系统正常运行,并等待 winlogon.exe 进程启动。
7. 当恶意驱动程序检测到 winlogon.exe 进程已启动时,它会向其中注入并执行最终的用户模式组件—— HTTP 下载器。
内核驱动程序
内核驱动程序主要负责四个任务:
将 HTTP 下载器注入到 winlogon.exe 中,并在线程终止时重新注入它;
保护部署在 ESP 上的 bootkit 文件不被删除;
解除用户模式 Windows Defender 进程 MsMpEngine.exe;
与 HTTP 下载器通信,并在必要时执行任何命令。
HTTP 下载器持久性
内核驱动程序负责部署 HTTP 下载程序。当驱动程序启动时,它会等待名为 winlogon.exe 的进程启动,然后再执行任何其他操作。进程启动后,驱动程序解密 HTTP 下载程序二进制文件,将其注入 winlogon.exe 的地址空间,并在新线程中执行。然后,驱动程序会定期检查线程是否仍在运行,并在必要时重复注入。如果驱动程序检测到内核调试器,则不会部署 HTTP 下载程序。
保护 ESP 上的 bootkit 文件不被删除
为了保护 ESP 上的 bootkit 文件,内核驱动程序使用了一个简单的技巧。它打开所有要保护的文件,复制并保存其句柄,并使用 ObSetHandleAttributes 内核函数将 HandleFlags(OBJECT_HANDLE_flag_INFORMATION)参数内的 ProtectFromClose 标志指定为 1,从而保护句柄不被任何其他进程关闭。这将阻止任何删除或修改受保护文件的尝试。受保护的文件包括:
ESP:EFIMicrosoftBootwinload.efiESP:EFIMicrosoftBootbootmgfw.efiESP:EFIMicrosoftBootgrubx64.efi
关键词: