Требования к драйверу ELAM
Установка драйвера должна использовать существующие средства для установки в сети и автономном режиме, регистрируя драйвер с помощью обычной обработки INF. Пример кода драйвера ELAM см. в следующих статьях: https://github.com/Microsoft/Windows-driver-samples/tree/main/security/elam
Установка драйвера AM
Чтобы обеспечить совместимость с установкой драйвера, драйвер ELAM объявляет себя как драйвер запуска загрузки, как и все остальные драйверы для запуска загрузки. Inf задает тип запуска SERVICE_BOOT_START (0), что указывает, что драйвер должен быть загружен загрузчиком и инициализирован во время инициализации ядра. Драйвер ELAM объявляет свою группу как "Ранний запуск". Поведение раннего запуска для драйверов в этой группе будет реализовано в Windows, как описано в следующем разделе.
Ниже приведен пример раздела установки драйвера inf драйвера ELAM.
[SampleAV.Service]
DisplayName = %SampleAVServiceName%
Description = %SampleAVServiceDescription%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 0 ; SERVICE_BOOT_START
ErrorControl = 3 ; SERVICE_ERROR_CRITICAL
LoadOrderGroup = “Early-Launch”
Так как драйвер AM не владеет устройствами, необходимо установить драйвер AM как устаревший, чтобы драйвер добавлялся только в качестве службы в реестр. (Если драйвер AM установлен как обычный драйвер PNP, он будет добавлен в раздел перечисления реестра и, следовательно, будет иметь ссылку PDO, что приведет к нежелательному поведению при выгрузке драйвера.)
Также необходимо включить раздел SignatureAttributes в INF-файл для драйвера ELAM.
Установка драйвера резервной копии
Чтобы обеспечить механизм восстановления в случае случайного повреждения драйвера ELAM, установщик ELAM также устанавливает копию драйвера в месте резервной копии. Это позволит WinRE получить чистую копию и восстановить установку.
Установщик считывает расположение файла резервной копии из ключа BackupPath , хранящегося в
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\EarlyLaunch
Затем установщик помещает резервную копию в папку, указанную в разделе реестра.
Инициализация драйвера AM
Загрузчик Windows Winload загружает все драйверы запуска загрузки и их зависимые библиотеки DLL в память перед отправкой в ядро Windows. Драйверы запуска загрузки представляют драйверы устройств, которые необходимо инициализировать перед инициализацией стека дисков. К этим драйверам относятся, среди прочего, стек дисков и диспетчер томов, а также драйвер файловой системы и драйверы шины для устройства операционной системы.
Интерфейс обратного вызова драйвера AM
Драйверы ELAM используют обратные вызовы, чтобы предоставить диспетчеру PnP описание каждого драйвера запуска загрузки и зависимой библиотеки DLL, и он может классифицировать каждый образ загрузки как известный хороший двоичный файл, известный плохой двоичный файл или неизвестный двоичный файл.
Политика операционной системы по умолчанию не предназначена для инициализации известных недопустимых драйверов и библиотек DLL. Политика может быть настроена и измеряется Winload в рамках аттестации загрузки.
PnP использует политику и классификацию, предоставляемую драйвером AM, чтобы решить, следует ли инициализировать каждый образ загрузки.
Обратные вызовы реестра
Драйверы раннего запуска могут использовать обратные вызовы драйвера реестра или загрузочного драйвера для мониторинга и проверки данных конфигурации, используемых в качестве входных данных для каждого драйвера загрузки и запуска. Данные конфигурации хранятся в кусте системного реестра, который загружается Winload и доступен во время инициализации драйвера загрузки.
Примечание
Все изменения в кусте реестра ELAM удаляются перед загрузкой системы. В результате драйвер ELAM должен использовать стандартное ведение журнала трассировки событий Windows вместо записи в реестр.
Эти обратные вызовы действительны в течение всего времени существования драйвера ELAM и будут отменены при выгрузке драйвера. См. также:
Обратные вызовы драйвера загрузки
Используйте IoRegisterBootDriverCallback и IoUnRegisterBootDriverCallback , чтобы зарегистрировать и отменить регистрацию BOOT_DRIVER_CALLBACK_FUNCTION.
Этот обратный вызов обеспечивает обновление состояния из Windows до драйвера ELAM, в том числе когда все драйверы запуска загрузки были инициализированы, а средство обратного вызова больше не работает.
Тип обратного вызова
Перечисление BDCB_CALLBACK_TYPE описывает два типа обратных вызовов:
- Обратные вызовы, предоставляющие обновления состояния для драйвера ELAM (BdCbStatusUpdate)
- Обратные вызовы, используемые драйвером AM для классификации драйверов запуска загрузки и зависимых библиотек DLL перед инициализацией образов (BdCbInitializeImage)
Два типа обратного вызова имеют уникальные контекстные структуры, предоставляющие дополнительные сведения, относящиеся к обратному вызову.
Контекстная структура обратного вызова обновления состояния содержит один перечислимый тип, описывающий выноску Windows.
Контекстная структура для обратного вызова инициализации образа является более сложной, содержащей хэш-данные и сведения о сертификате для каждого загруженного образа. Структура также содержит поле, являющееся выходным параметром, в котором драйвер AM хранит тип классификации для драйвера.
Ошибка, возвращаемая обратным вызовом обновления состояния, рассматривается как неустранимая ошибка и приводит к системной ошибке проверка. Это позволяет драйверу ELAM указать, когда состояние достигается за пределами политики AM. Например, если драйвер среды выполнения AM не был загружен и не инициализирован, драйвер раннего запуска может завершить обратный вызов подготовки к выгрузке, чтобы предотвратить переход Windows в состояние без загруженного драйвера AM.
Если при обратном вызове инициализации образа возвращается ошибка, образ считается неизвестным. Неизвестные драйверы инициализируются или пропускают их инициализацию на основе политики ОС.
Подписи вредоносных программ
Данные сигнатуры вредоносных программ определяются AM ISV, но должны включать, как минимум, утвержденный список хэшей драйверов. Данные сигнатуры хранятся в реестре в новом кусте "Драйверы раннего запуска" в разделе HKLM, загруженном Winload. Каждый драйвер AM имеет уникальный ключ для хранения большого двоичного объекта сигнатуры. Путь и раздел реестра имеют следующий формат:
HKLM\ELAM\<VendorName>\
В ключе поставщик может свободно определять и использовать любое из значений. Существует три определенных значения двоичных blob-объектов, которые измеряются измеряемой загрузкой, и поставщик может использовать каждое из них:
- Измеряется
- Политика
- Config
Куст ELAM выгружается после его использования ранним запуском антивредоносного ПО для повышения производительности. Если служба пользовательского режима хочет обновить данные подписи, она должна подключить файл Hive из расположения файла \Windows\System32\config\ELAM. Например, можно создать UUID, преобразовать его в строку и использовать его в качестве уникального ключа для подключения куста. Формат хранения и извлечения этих больших двоичных объектов данных остается за isV, но данные подписи должны быть подписаны, чтобы драйвер AM смог проверить целостность данных.
Проверка подписей вредоносных программ
Метод проверки целостности данных сигнатур вредоносных программ остается за каждым AM ISV. Криптографические примитивные функции CNG доступны для проверки цифровых подписей и сертификатов в данных сигнатур вредоносных программ.
Сбой подписи вредоносных программ
Если драйвер ELAM проверяет целостность данных сигнатуры и проверка завершается ошибкой или данные сигнатуры отсутствуют, инициализация драйвера ELAM по-прежнему завершается успешно. В этом случае для каждого загрузочного драйвера драйвер ELAM должен возвращать значение unknown для каждого обратного вызова инициализации. Кроме того, драйвер ELAM должен передать эти сведения в компонент AM среды выполнения после запуска.
Выгрузка драйвера AM
Если тип обратного вызова StatusType имеет значение BdCbStatusPrepareForUnload, это указывает драйверу AM на то, что все загрузочные драйверы инициализированы и что драйвер AM должен подготовиться к выгрузке. Перед выгрузками драйверу раннего запуска необходимо отменить регистрацию обратных вызовов. Отмена регистрации не может произойти во время обратного вызова; скорее, это должно произойти в функции DriverUnload, которую драйвер может указать во время DriverEntry.
Чтобы обеспечить непрерывность защиты от вредоносных программ и обеспечить надлежащую передачу, необходимо запустить подсистему AM среды выполнения до выгрузки драйвера с ранним запуском. Это означает, что подсистема am среды выполнения должна быть загрузочным драйвером, который проверяется драйвером РАННЕГО запуска.
Производительность
Драйвер должен соответствовать требованиям к производительности, определенным в следующей таблице:
Сценарии |
Время начала |
Время окончания |
Верхняя граница |
Оцените загруженный критически важный драйвер загрузки, прежде чем разрешить ему инициализацию. Сюда также входят обратные вызовы обновления состояния. |
Ядро вызывает драйвер защиты от вредоносных программ для оценки загруженного загрузочного критического драйвера. |
Драйвер защиты от вредоносных программ возвращает результат оценки. |
0,5 мс |
Оценка всех загруженных критически важных драйверов загрузки |
Ядро вызывает драйвер защиты от вредоносных программ для оценки первого загруженного загрузочного критического драйвера. |
Антивредоносный драйвер возвращает результат оценки для критического драйвера последней загрузки. |
50 мс |
Занимаемое место (драйвер и данные конфигурации в памяти) |
Н/Д |
Н/Д |
128 КБ |
Инициализация драйверов
После оценки загрузочных драйверов драйвером ELAM ядро использует классификацию, возвращенную ELAM, чтобы решить, следует ли инициализировать драйвер. Это решение определяется политикой и хранится здесь в реестре по адресу:
HKLM\System\CurrentControlSet\Control\EarlyLaunch\DriverLoadPolicy
Это можно настроить с помощью групповая политика на клиенте, присоединенном к домену. Антивредоносное решение может захотеть предоставить эту функцию пользователю в неуправляемых сценариях. Для DriverLoadPolicy определены следующие значения:
PNP_INITIALIZE_DRIVERS_DEFAULT 0x0 (initializes known Good drivers only)
PNP_INITIALIZE_UNKNOWN_DRIVERS 0x1
PNP_INITIALIZE_BAD_CRITICAL_DRIVERS 0x3 (this is the default setting)
PNP_INITIALIZE_BAD_DRIVERS 0x7
Сбои загрузки
Если драйвер загрузки пропущен из-за политики инициализации, ядро продолжает пытаться инициализировать следующий драйвер загрузки в списке. Это продолжается до тех пор, пока не будут инициализированы все драйверы или не произошел сбой загрузки, так как пропущенный загрузочный драйвер был критически важным для загрузки. Если сбой происходит после запуска стека дисков, то имеется аварийный дамп, который содержит некоторые сведения о причине или сбое, чтобы включить сведения об отсутствующих драйверах. Его можно использовать в WinRE, чтобы определить причину сбоя и попытаться исправить.
ELAM и измеряемая загрузка
Если драйвер ELAM обнаруживает нарушение политики (например, rootkit), он должен немедленно вызвать Tbsi_Revoke_Attestation , чтобы сделать недействительными PCR, указывающие на то, что система была в хорошем состоянии. Функция возвращает ошибку, если возникла проблема с измеряемой загрузкой, например отсутствие доверенного платформенного модуля в системе.
Tbsi_Revoke_Attestation можно вызывать из режима ядра. Он расширяет PCR[12] на неопределенное значение и увеличивает счетчик событий в TPM. Оба действия необходимы, поэтому доверие нарушается во всех кавычках, которые создаются отсюда вперед. В результате журналы измеряемой загрузки не будут отражать текущее состояние доверенного платформенного модуля в течение оставшегося времени включения доверенного платформенного модуля, и удаленные системы не смогут сформировать доверие к состоянию безопасности системы.