В этой статье я покажу, как можно обойти шифрование BitLocker в Windows 11 (версия 24H2) и извлечь из памяти ключи шифрования тома (full volume encryption key, FVEK) при помощи моего инструмента Memory-Dump-UEFI.
Если у нападающего есть физический доступ к устройству, то он потенциально может получить доступ, резко перезапустив компьютер и выполнив дамп ОЗУ из недавно выполнявшихся экземпляров Windows. Дамп памяти можно проанализировать, чтобы найти конфиденциальную информацию, например, ключи FVEK. Эта методика не работает гарантированно, потому что после отключения питания содержимое ОЗУ быстро деградирует.

Существует множество методик замедления этой деградации памяти, например, физическое охлаждение ОЗУ или использование внешних источников питания с целью поддержания подачи энергии. Для своего демо я закоротил контакты сброса на материнской плате устройства, что заставляет систему резко отключаться без потери питания.
Ещё одна потенциальная проблема заключается в secure boot — стандарте безопасности, который ограничивает то, что может выполняться при запуске системы. Эта защита имеет собственные ограничения, и ещё уже обходили при помощи shim и множества других способов, которые для нашего демо несущественны.
Для этого этапа нам понадобится USB-накопитель, размер которого больше, чем объём ОЗУ целевой системы. Для упрощения этого этапа я написал скрипт
Воспользуйтесь инструкциями по созданию и применению загружаемого приложения.
Этот этап можно реализовать множеством разных способов; наша основная цель — минимизировать временной промежуток, в течение которого питание компьютера полностью отключено. По моему опыту, максимального успеха можно добиться, перезагружая систему, когда Windows ещё загружается, но не достигла экрана логина; по крайней мере, это справедливо в случае поиска ключей FVEK.
Незамедлительно выполняем запуск Memory-Dump-UEFI с USB-устройства. Мы окажемся в оболочке UEFI, в которой можно выполнить

На скриншоте показано, как должно выглядеть успешное попадание в оболочку. Дамп памяти начнёт генерировать файлы дампа, пока у него не закончится память. После завершения можно спокойно отключить компьютер обычным образом.
Вероятно, приложение создаст множество дампов. Это вызвано ограничением в 4 ГБ на размер файла, накладываемым файловой системой FAT32. Чтобы соответствовать спецификации UEFI, необходимо использовать эту файловую систему. Для удобства я добавил в папку инструментов программу

Pool tag — это 4-символьные идентификаторы, указывающие, где находятся пулы памяти ядра Windows. Пулы распределяются ядром Windows, это отличное место для поиска конфиденциальной информации. Существует большое множество таких pool tag; я составил текстовый файл
Прежде чем двигаться дальше, хотелось бы выразить благодарность Microsoft за то, что она чётко отметила, где в памяти находятся криптографические ключи. В Windows 7 для восстановления ключа достаточно было найти pool tag
Первое местоположение ключа FVEK находилось по pool tag

Второе место находится под pool tag

Важно отметить, что полученному ключу должно предшествовать обозначение применённого алгоритма. То есть если ключ имеет вид
Дальше нужно сдампить это шестнадцатеричное значение в файл. Это можно сделать так:
Я крайне рекомендую использовать набор инструментов
Оптимальнее всего разбираться в том, как Microsoft реализовала Bitlocker, выполнив отладку на уровне ядра при помощи
https://tribalchicken.net/recovering-bitlocker-keys-on-windows-8-1-and-10/
https://github.com/libyal/libbde/blob/main/documentation/BitLocker%20Drive%20Encryption%20(BDE)%20format.asciidoc
https://github.com/Aorimn/dislocker
https://github.com/microsoft/SymCrypt
https://github.com/libyal/libbde
https://github.com/zodiacon/PoolMonX/blob/master/res/pooltag.txt
https://techcommunity.microsoft.com/blog/askperf/an-introduction-to-pool-tags/372983
Если у вас возникли какие-то вопросы, то можете связаться со мной по этому адресу:
NoInitRD@gmail.com
Краткая справка
Если у нападающего есть физический доступ к устройству, то он потенциально может получить доступ, резко перезапустив компьютер и выполнив дамп ОЗУ из недавно выполнявшихся экземпляров Windows. Дамп памяти можно проанализировать, чтобы найти конфиденциальную информацию, например, ключи FVEK. Эта методика не работает гарантированно, потому что после отключения питания содержимое ОЗУ быстро деградирует.

Существует множество методик замедления этой деградации памяти, например, физическое охлаждение ОЗУ или использование внешних источников питания с целью поддержания подачи энергии. Для своего демо я закоротил контакты сброса на материнской плате устройства, что заставляет систему резко отключаться без потери питания.
Ещё одна потенциальная проблема заключается в secure boot — стандарте безопасности, который ограничивает то, что может выполняться при запуске системы. Эта защита имеет собственные ограничения, и ещё уже обходили при помощи shim и множества других способов, которые для нашего демо несущественны.
Этап 1: создаём загрузочное USB-устройство
Для этого этапа нам понадобится USB-накопитель, размер которого больше, чем объём ОЗУ целевой системы. Для упрощения этого этапа я написал скрипт
flashimage.sh
.Воспользуйтесь инструкциями по созданию и применению загружаемого приложения.
Этап 2: резкий перезапуск целевой системы
Этот этап можно реализовать множеством разных способов; наша основная цель — минимизировать временной промежуток, в течение которого питание компьютера полностью отключено. По моему опыту, максимального успеха можно добиться, перезагружая систему, когда Windows ещё загружается, но не достигла экрана логина; по крайней мере, это справедливо в случае поиска ключей FVEK.
Этап 3: загружаемся с USB-устройства
Незамедлительно выполняем запуск Memory-Dump-UEFI с USB-устройства. Мы окажемся в оболочке UEFI, в которой можно выполнить
app.efi
. Подробнее о том, как это сделать, можно прочитать в файле README приложения. Объём требуемого времени зависит от объёма ОЗУ, подвергающегося дампу, и скорости USB-устройства. Я рекомендую на этом этапе отключить все другие USB-устройства, чтобы программа случайно не выполнила запись не на тот накопитель.
На скриншоте показано, как должно выглядеть успешное попадание в оболочку. Дамп памяти начнёт генерировать файлы дампа, пока у него не закончится память. После завершения можно спокойно отключить компьютер обычным образом.
Этап 4: анализ дампов
Подготовка
Вероятно, приложение создаст множество дампов. Это вызвано ограничением в 4 ГБ на размер файла, накладываемым файловой системой FAT32. Чтобы соответствовать спецификации UEFI, необходимо использовать эту файловую систему. Для удобства я добавил в папку инструментов программу
concatDumps
, в хронологическом порядке соединяющую множество дампов в один. Дамп будет состоять из сырых данных, находившихся в памяти на момент его создания, поэтому для удобства чтения я рекомендую воспользоваться инструментом наподобие xxd
. В помощь поиску по дампам я написал программу searchMem
, позволяющую искать в дампе шестнадцатеричные паттерны. Она находит смещение вхождений таких шестнадцатеричных паттернов, к которым можно затем перейти командой xxd -s <offset> <dump>
.
Pool Tag
Pool tag — это 4-символьные идентификаторы, указывающие, где находятся пулы памяти ядра Windows. Пулы распределяются ядром Windows, это отличное место для поиска конфиденциальной информации. Существует большое множество таких pool tag; я составил текстовый файл
pooltag.txt
, содержащий список всех pool tag и подробности об их предназначении.Прежде чем двигаться дальше, хотелось бы выразить благодарность Microsoft за то, что она чётко отметила, где в памяти находятся криптографические ключи. В Windows 7 для восстановления ключа достаточно было найти pool tag
FVEc
, соответствующий криптографическим распределениям fvevol.sys
. В Windows 8.1 и 10 ключ можно найти в пуле памяти, маркированном Cngb
; он соответствует модулю ksecdd.sys
. В процессе моего изучения дампа памяти Windows 11 я не смог найти ключ ни в одном из этих мест, но нашёл его в двух других.Восстановление ключа FVEK
Первое местоположение ключа FVEK находилось по pool tag
dFVE
, обозначающему распределение памяти dumpfve.sys
, относящегося к фильтру аварийного дампа шифрования тома для шифрования диска Bitlocker. Этот pool tag выделен синим, а ключ FVEK — краснымм. Это было самое простое местоположение ключа из найденных мной; кроме тому, ему предшествует паттерн 0x0480
, обозначающий тип используемого шифрования (в моём случае это XTS-AES-128).
Второе место находится под pool tag
None
, соответствующим вызовам процедуры ExAllocatePool
. На этот раз первая половина ключа встречается два раза, а вторая — один раз.
Дальнейшие шаги
Важно отметить, что полученному ключу должно предшествовать обозначение применённого алгоритма. То есть если ключ имеет вид
b2cbc06071931b7cc50b59f8789571f4dd815c2008e93c02d5c6cd98c83ef54b
, то вам нужно добавить в начало ключа 0x8004
(или обозначение другого алгоритма) в формате little endian:0480b2cbc06071931b7cc50b59f8789571f4dd815c2008e93c02d5c6cd98c83ef54b
Дальше нужно сдампить это шестнадцатеричное значение в файл. Это можно сделать так:
echo "0480b2cbc06071931b7cc50b59f8789571f4dd815c2008e93c02d5c6cd98c83ef54b" | xxd -r -p > output.fvek
Я крайне рекомендую использовать набор инструментов
dislocker
для определения нужного алгоритма/значения и разблокировки диска. Если сделать всё правильно, то можно воспользоваться output.fvek
для разблокировки защищённого Bitlocker раздела и доступа к любым данным в томе.Выводы
Оптимальнее всего разбираться в том, как Microsoft реализовала Bitlocker, выполнив отладку на уровне ядра при помощи
windbg
. Это достаточно легко сделать при помощи виртуальных машин или кроссоверного кабеля USB 3.0 A/A. Нахождение ключа в первую очередь стало возможным благодаря пошаговому выполнению процесса запуска Windows и наблюдению за действиями Bitlocker. Microsoft предпринимает усилия по удалению ключей при помощи функций наподобие SymCryptSessionDestroy
, но им не удаётся уничтожить все ключи, как видно из того, что они присутствуют в куче.Ссылки
https://tribalchicken.net/recovering-bitlocker-keys-on-windows-8-1-and-10/
https://github.com/libyal/libbde/blob/main/documentation/BitLocker%20Drive%20Encryption%20(BDE)%20format.asciidoc
https://github.com/Aorimn/dislocker
https://github.com/microsoft/SymCrypt
https://github.com/libyal/libbde
https://github.com/zodiacon/PoolMonX/blob/master/res/pooltag.txt
https://techcommunity.microsoft.com/blog/askperf/an-introduction-to-pool-tags/372983
Связь
Если у вас возникли какие-то вопросы, то можете связаться со мной по этому адресу:
NoInitRD@gmail.com