Устранение рисков памяти UEFI

Требования центра сертификации UEFI (ЦС) сторонних поставщиков Майкрософт обновляются, чтобы в образах UEFI включались средства устранения рисков памяти. Эти изменения будут отражены в требованиях к подписи UEFI — Microsoft Tech Community.

Агентство по безопасности инфраструктуры & кибербезопасности недавно обнаружило, что уязвимости встроенного ПО в целом продолжают расти. В то же время развертываемых методов устранения рисков встроенного ПО недостаточно для предотвращения современных атак, а меры по устранению рисков не применяются равномерно в реализациях встроенного ПО поставщика.

Эти выводы согласуются с призывами к действию со стороны сообщества Tianocore, сообщества исследований безопасности и сообщества UEFI. Базовые базовые методы устранения рисков необходимы в экосистеме для повышения безопасности платформы устройств Windows.

Для реализации этой цели корпорация Майкрософт вводит следующие требования к подписи ЦС UEFI сторонних разработчиков.

Требования к подписывам для устранения рисков в памяти

Метаданные PE/COFF

  1. Выравнивание разделов отправленного PE-файла должно быть выровнено по размеру страницы. Это значение должно быть 4 КБ или больше 2 (например, 64 КБ).

  2. Флаги разделов не должны объединять IMAGE_SCN_MEM_WRITE и IMAGE_SCN_MEM_EXECUTE для любого из указанных разделов.

Если реализовано: аттестация БИБЛИОТЕКИ PE/COFF

  • Характеристики БИБЛИОТЕКи DLL должны включать IMAGE_DLLCHARACTERISTICS_NX_COMPAT

Так как соответствие требованиям No Execute (NX) не может быть обнаружено статически, встроенное ПО, которое задает IMAGE_DLLCHARACTERISTICS_NX_COMPAT , должно выполнить следующие действия, чтобы убедиться, что образ встроенного ПО может правильно работать с примененными средствами защиты NX.

  1. Модуль кода не должен выполнять самоизменяющийся код; это означает, что разделы кода приложения не должны иметь атрибут write. Любая попытка изменить значения в диапазоне памяти приведет к сбою выполнения.

  2. Если модуль кода пытается загрузить какой-либо внутренний код в память для выполнения или если он обеспечивает поддержку внешнего загрузчика, он должен использовать EFI_MEMORY_ATTRIBUTE_PROTOCOL соответствующим образом. Этот необязательный протокол позволяет вызывающей объекту получать, задавать и очищать атрибуты чтения, записи и выполнения для четко определенного диапазона памяти.

    • Внутренний код, загруженный в память, должен поддерживать WRITE и EXECUTE эксклюзивность. Атрибуты также должны быть изменены после загрузки кода, чтобы разрешить выполнение.
    • Внешние загрузчики должны поддерживаться EFI_MEMORY_ATTRIBUTE_PROTOCOL , если они доступны в системе. Загрузчик не должен предполагать, что только что выделенная память позволяет выполнять код (даже для типов кода).
  3. Приложение не должно предполагать, что все диапазоны памяти являются допустимыми; в частности, страница 0 (обычно по физическому адресу от 0 до 4 КБ).

  4. Пространство стека нельзя использовать для выполнения кода.

Средство проверки изображений PE/COFF доступно для проверки соответствия изображения требованиям к метаданным (требованиям к pe/COFF статического изображения) для задания бита характеристики DLL.

Применение требований к устранению рисков памяти

Выравнивание раздела изображения позволяет среде встроенного ПО UEFI/Platform Initialization (PI) защитить раздел с помощью атрибутов таблицы страниц. Кроме того, компоненты встроенного ПО должны предполагать, что атрибуты таблицы страниц будут применены к образу встроенного ПО, чтобы включить следующие функции:

  • Защита памяти no Execute (NX) — все разделы, не относящиеся к коду, будут помечены как NX, а разделы кода будут помечены как доступные только для чтения (RO), чтобы предотвратить выполнение внешних разделов кода и перезапись разделов кода.

  • Защита страниц — страница защиты может быть добавлена до и после выделения соответствующей страницы. Любая попытка получить доступ к странице guard приведет к сбою страницы (#PF).

  • Охранники пула — страница головной и хвостовой охранной страницы будут размещаться до и после той части памяти, которую занимает выделенный пул. Рекомендуется, чтобы поставщик проверял как недополученный поток (с помощью страницы головной защиты), так и переполнение (с помощью заключительной страницы).

  • Защита стека ЦП. Страница защиты в таблице страниц имеет значение Не присутствует и помещается в нижнюю часть стека для обнаружения переполнения стека.

  • Защита указателя NULL — нет доступа к первой странице (при нулевом адресе). Хотя устаревшие реализации BIOS помещали таблицу векторов прерываний (IVT) в это расположение, встроенное ПО UEFI должно ожидать, что эта страница помечена как Не представлена для перехвата разыменовок указателя NULL.

Выравнивание файлов и разделов

Компоновщики, такие как MSVC, обычно предлагают несколько вариантов выравнивания. Например, в MSVC влияет на выравнивание в макете двоичного файла, /FILEALIGN что может оказать относительно значительное влияние на общий размер файла. /ALIGN управляет выравниванием различных разделов в памяти после загрузки. Это выравнивание раздела (/ALIGN) является важным для этих изменений.

обратная совместимость

Встроенное ПО платформы может сохранить обратную совместимость при попытке включить IMAGE_DLLCHARACTERISTICS_NX_COMPAT , восстанавливая выделение памяти RWX при загрузке модуля, для которых не IMAGE_DLLCHARACTERISTICS_NX_COMPAT задан бит. Ожидается, что эта политика будет удалена со временем, когда экосистема примет это изменение.

/ALIGN (выравнивание разделов)

/FILEALIGN (выравнивание разделов в файлах)

Обзор за пределами BIOS — защита памяти в BIOS UEFI BIOS

Стратегия DHS CISA для устранения уязвимостей ниже ОС среди худших преступников

Project Mu: функция защиты памяти

Средство проверки изображений PE/COFF

Защита экосистемы UEFI: цепочка поставок встроенного ПО жестко (закодирована)

Встроенное ПО UEFI — обеспечение безопасности СММ

Требования к подписи UEFI — Microsoft Tech Community