
baton drop (CVE-2022-21894): уязвимость обхода функции безопасности Secure Boot
Загрузочные приложения Windows позволяют параметру truncatememory удалять блоки памяти, содержащие «постоянные» диапазоны сериализованных данных, из карты памяти, что приводит к обходу Secure Boot.
truncatememory удаляет всю память выше указанного физического адреса из карты памяти.bootdebug, testsigning, nointegritychecks), нарушая тем самым Secure Boot.Эта проблема была исправлена двумя изменениями:
bootmgr, инициализация загрузочного приложения завершается с ошибкой.VERSIONINFO с полем OriginalFilename и это имя файла содержится в блок-листе (включающем bootmgr.exe и hvloader.exe; в Nickel был добавлен hvloader.efi, но это изменение не было перенесено обратно), загрузка завершается с ошибкой.
hvloader.exe не включён в блок-лист winload — изначально он был включён, что ломало загрузку Hyper-V!flightedbootmgr для загрузки bootmgr с диска), поле OriginalFilename обязательно должно быть bootmgr.exe.Атакующему необходимо обеспечить выделение сериализованной политики Secure Boot выше известного физического адреса.
osdevice записи BCD является разделом, зашифрованным BitLocker, где VMK был получен с использованием TPM.
Элемент avoidlowmemory можно использовать, чтобы все выделения физической памяти находились выше указанного физического адреса:
bootmgr с указанием пользовательского пути BCD (с помощью элемента bcdfilepath он же custom:22000023) может использоваться для обхода этого ограничения.bootmgr из Windows 8.x, чтобы отключить VBS, а затем вернуть исходный загрузчик.
bootmgr из Windows 8.x не сможет распаковать VMK в системе Windows 10+.hvloader.efi может быть загружен с элементом nointegritychecks для загрузки самозаверенного mcupdate.dll, чья точка входа будет вызвана до ExitBootServices.
В качестве альтернативы на системах, отличных от AMD64, можно использовать winload.efi до TH2 с элементом testsigning; это допускает самозаверенные двоичные файлы с EKU szOID_NT5_CRYPTO в сертификате.
В системах ARMv7 для получения выполнения кода необходима загрузка пропатченного самозаверенного hal.dll с импортом mcupdate.dll.
В системах x86 и AMD64 файл, загружаемый как mcupdate.dll, должен называться mcupdate_*.dll, где * — строка производителя CPUID (GenuineIntel, AuthenticAMD и т. д.).
В системах ARM64 этот метод не может быть использован, поскольку самой ранней доступной подписанной производственной сборкой является WinPE из RS2; поэтому в настоящее время возможно только выполнение кода с подключённым отладчиком (с использованием bootdebug).
Этот репозиторий включает следующие файлы:
mcupdate.dll выполняется по виртуальному адресу с включённой трансляцией страниц, невозможно напрямую вызвать функции EFI (для вызова функций EFI необходимо отключить трансляцию страниц; возврат к виртуальному адресу при отключённой трансляции страниц не приведёт к хорошим последствиям).BlImgLoadPEImageEx или BlImgLoadPEImageFromSourceBuffer с установленным битом 0 во флагах, чтобы загрузить дополнительный payload с сопоставлением физических адресов с виртуальными 1:1.
BlImgAllocateImageBuffer с тем же установленным битом, чтобы выделить память с сопоставлением физических адресов с виртуальными 1:1; затем загрузить payload самостоятельно (или переназначить себя туда).bootmgfw из Windows 8 RTM и hvloader из TH1 RTM.
hvloader, полученную по смещению, и затем бесконечно зацикливается.bootmgr из RS1 и hvloader из TH1 RTM.Эта проблема может быть использована для извлечения ключей BitLocker (где Secure Boot используется для проверки целостности).
Исправление этой проблемы также исправило другую проблему, у которой нет CVE.
bootmgr игнорирует любую уже находящуюся в памяти таблицу ключей BitLocker и выделяет новую, не затирая старую.
bootmgr RS2+ из bootmgr (указав произвольный osdevice, где Secure Boot используется для проверки целостности), загрузиться в WinPE, загрузить известный уязвимый драйвер и использовать его для поиска и извлечения существующей таблицы ключей BitLocker в физической памяти.Ни одно известное уязвимое загрузочное приложение ещё не было отозвано.
bootmgr проверяет свою собственную подпись.Произошёл неполный отзыв, а также появился ещё один CVE (CVE-2023-24932). Всё ещё существуют уязвимые bootmgfw, которые не были отозваны, а также дополнительные исправления, устраняющие только случай, когда bootmgr загружает bootmgr. Чтобы заставить Microsoft действовать, понадобился лишь обнародованный буткит ;)
Если вы достаточно креативны, вы найдёте способ обойти отзыв более чем 2000 файлов bootmgfw ;)
bootmgr версии 19041.1081 и hvloader из TH1 RTM.