Windows 启动应用程序允许使用 truncatememory 设置从内存映射中移除包含序列化数据“持久”范围的内存块,从而导致 Secure Boot 绕过。
truncatememory BCD 元素会从内存映射中移除指定物理地址以上的所有内存。bootdebug、testsigning、nointegritychecks),从而破坏 Secure Boot。该问题通过两个不同的更改修复:
bootmgr,则启动应用程序初始化失败。OriginalFilename 的 VERSIONINFO 资源,并且该文件名包含在黑名单中(包含 bootmgr.exe 和 hvloader.exe;在 Nickel 中,添加了 hvloader.efi,但未向后移植),则加载失败。
hvloader.exe 不在 winload 的黑名单中——它原本应该在内,但这破坏了 Hyper-V 加载!flightedbootmgr 元素一起使用,从磁盘加载 bootmgr),则 OriginalFilename 必须 为 bootmgr.exe。攻击者需要确保序列化的 Secure Boot 策略分配在已知物理地址之上。
osdevice 是一个 BitLocker 加密分区,并且 VMK 是通过 TPM 派生的,则序列化的 Secure Boot 策略会被重新分配。
avoidlowmemory 元素可用于确保所有物理内存分配都位于指定物理地址之上:
bootmgr 并指定自定义 BCD 路径(使用 bcdfilepath 元素,即 custom:22000023)来绕过此限制。bootmgr 进行一次攻击以禁用 VBS,然后换回原始引导加载程序。
bootmgr 将无法在 Windows 10+ 系统上解封 VMK。可以使用 nointegritychecks 元素加载 hvloader.efi 来加载自签名的 mcupdate.dll,其入口点将在 ExitBootServices 之前被调用。
或者,在非 AMD64 系统上,可以使用 TH2 之前的 winload.efi 配合 testsigning 元素;这允许证书中包含 szOID_NT5_CRYPTO EKU 的自签名二进制文件。
在 ARMv7 系统上,需要加载打了补丁的自签名 hal.dll,并导入 mcupdate.dll 以获得代码执行能力。
在 x86 和 AMD64 系统上,作为 mcupdate.dll 加载的文件必须命名为 mcupdate_*.dll,其中 * 是 CPUID 制造商字符串(如 GenuineIntel、AuthenticAMD 等)。
在 ARM64 系统上,由于最早可用的生产签名版本是 RS2 的 WinPE,因此此技术无法使用;目前只能执行绑定式代码执行(使用 bootdebug)。
此仓库包含以下文件:
mcupdate.dll 在启用分页的虚拟地址上运行,因此无法直接调用 EFI 函数(需要禁用分页才能调用 EFI 函数,返回到禁用分页的虚拟地址会导致不良后果)。BlImgLoadPEImageEx 或 BlImgLoadPEImageFromSourceBuffer,并在标志中设置位 0,以在 1:1 物理地址-虚拟地址映射中加载附加负载。
BlImgAllocateImageBuffer 并设置相同的位,以在 1:1 物理地址-虚拟地址映射中分配内存;然后自行加载负载(或将自身重新映射到那里)。bootmgfw 和 TH1 RTM 的 hvloader 进行利用。
hvloader 中通过偏移量获取的函数在屏幕上打印一条消息,然后进入无限循环。bootmgr 和 TH1 RTM 的 hvloader 进行利用。bootmgr 和 TH1 RTM 的 hvloader 进行利用。此问题可用于转储 BitLocker 密钥(当使用 Secure Boot 进行完整性验证时)。
此问题的修复还修复了另一个没有 CVE 的问题。
bootmgr 会忽略内存中已有的任何 BitLocker 密钥表,并分配一个新的,而不会清除旧的。
bootmgr 加载 RS2+ 的 bootmgr(指定任意使用 Secure Boot 进行完整性验证的 osdevice),启动到 WinPE,加载已知的易受攻击驱动程序,并使用它在物理内存中搜索并转储现有的 BitLocker 密钥表。目前尚无已知的易受攻击启动应用程序被撤销。
bootmgr 会检查自己的签名,启动也会失败。发生了不完整的撤销,以及另一个 CVE(CVE-2023-24932)。仍有一些未撤销的易受攻击 bootmgfw,以及仅修复了 bootmgr 加载 bootmgr 情况的额外补丁。这只需要一个粘贴的 bootkit 就能促使微软采取行动 ;)
如果你足够有创意,你就会找到绕过 2000 多个 bootmgfw 文件撤销的方法 ;)