Обработка олицетворения клиента в драйверах UMDF 1.x
Предупреждение
UMDF 2 является последней версией UMDF и заменяет UMDF 1. Все новые драйверы UMDF должны быть написаны с помощью UMDF 2. Новые функции не добавляются в UMDF 1, а поддержка UMDF 1 в более новых версиях Windows 10 ограничена. Универсальные драйверы Windows должны использовать UMDF 2.
Архивные примеры UMDF 1 можно найти в Windows 11 версии 22H2 — обновление примеров драйверов за май 2022 г.
Дополнительные сведения см. в разделе начало работы с помощью UMDF.
Драйверы UMDF обычно выполняются под учетной записью LocalService и не могут получить доступ к файлам или ресурсам, которым требуются учетные данные пользователя, например к защищенным файлам или другим защищенным ресурсам. Драйвер UMDF обычно работает с командами и данными, которые передаются между клиентским приложением и устройством. Поэтому большинство драйверов UMDF не обращаются к защищенным ресурсам.
Однако некоторым драйверам может потребоваться доступ к защищенному ресурсу. Например, драйвер UMDF может загружать встроенное ПО на устройство из файла, который предоставляет клиентское приложение. Файл может содержать список управления доступом (ACL), который не позволяет неавторизованным пользователям изменять файл и управлять устройством. К сожалению, этот список управления доступом также не позволяет драйверу UMDF получить доступ к файлу.
Платформа предоставляет возможность олицетворения, которая позволяет драйверам олицетворять клиент драйвера и получать права доступа клиента к защищенным ресурсам.
Включение олицетворения
Как пакет установки драйвера UMDF, так и клиентское приложение должны включить возможность олицетворения платформы следующим образом:
INF-файл пакета установки драйвера UMDF должен содержать директиву UmdfImpersonationLevel и задавать максимально допустимый уровень олицетворения. Олицетворение включено, только если INF-файл содержит директиву UmdfImpersonationLevel . Дополнительные сведения о настройке уровня олицетворения см. в разделе Указание директив WDF в INF-файлах.
Клиентское приложение должно задать допустимый уровень олицетворения для каждого дескриптора файла. Приложение использует параметры качества обслуживания (QoS) в функции Microsoft Win32 CreateFile , чтобы задать допустимый уровень олицетворения. Дополнительные сведения об этих параметрах см. в параметре dwFlagsAndAttributescreateFile в документации windows SDK.
Обработка олицетворения для запроса ввода-вывода
Драйвер UMDF и платформа обрабатывают олицетворение для запроса ввода-вывода в следующей последовательности:
Драйвер вызывает метод IWDFIoRequest::Impersonate для указания требуемого уровня олицетворения и функции обратного вызова IImpersonateCallback::OnImpersonate .
Платформа проверяет запрошенный уровень олицетворения. Если запрошенный уровень превышает уровень, разрешенный пакетом установки драйвера UMDF и клиентским приложением, запрос олицетворения завершается ошибкой. В противном случае платформа олицетворяет клиента и немедленно вызывает функцию обратного вызова OnImpersonate .
Функция обратного вызова OnImpersonate должна выполнять только те операции, для которых требуется запрошенный уровень олицетворения, например открытие защищенного файла.
UMDF не позволяет функции обратного вызова OnImpersonate драйвера вызывать какие-либо объектные методы платформы. Это гарантирует, что драйвер не будет предоставлять уровень олицетворения другим функциям обратного вызова драйвера или другим драйверам.
Примечание В версиях 1.0–1.7 UMDF IWDFIoRequest::Impersonate предоставляет наивысший уровень олицетворения, разрешенный клиентским приложением и INF-файлом, даже если уровень олицетворения, запрашиваемый драйвером, ниже. В UMDF версии 1.9 и более поздних метод Impersonate предоставляет только уровень олицетворения, запрашиваемый драйвером.
Передача учетных данных в стеке драйверов
Когда драйвер получает типизированный запрос ввода-вывода WdfRequestCreate, драйвер может перенаправить запрос ввода-вывода в стек драйвера в режиме ядра. Драйверы в режиме ядра не имеют возможности олицетворения, которые IWDFIoRequest::Impersonate предоставляет драйверам на основе UMDF.
Таким образом, если требуется, чтобы драйвер в режиме ядра получал учетные данные пользователя клиента (а не учетные данные хост-процесса драйвера), драйвер должен установить флаг WDF_REQUEST_SEND_OPTION_IMPERSONATE_CLIENT при вызове IWDFIoRequest::Send , чтобы отправить запрос на создание целевому объекту ввода-вывода. Метод Send возвращает код ошибки, если попытка олицетворения завершается неудачно, если драйвер также не устанавливает флаг WDF_REQUEST_SEND_OPTION_IMPERSONATION_IGNORE_FAILURE .
Драйверу не нужно вызывать IWDFIoRequest::Impersonate перед отправкой запроса в целевой объект ввода-вывода.
Если драйверы нижнего уровня также перенаправят запрос, уровень олицетворения клиента перемещается вниз по стеку драйверов.
Снижение угроз безопасности
Чтобы снизить вероятность атаки с повышением привилегий, необходимо:
Старайтесь не использовать олицетворение.
Например, чтобы избежать использования олицетворения для открытия файла, который должен использовать драйвер, клиентское приложение может открыть файл и использовать операции ввода-вывода для отправки содержимого файла в драйвер.
Используйте самый низкий уровень олицетворения, необходимый драйверу.
Установите уровень олицетворения в INF-файле драйвера как можно ниже. Если драйвер не требует олицетворения, не включайте директиву UmdfImpersonationLevel в INF-файл.
Сведите к минимуму возможности злоумышленника использовать ваш драйвер.
Функция обратного вызова OnImpersonate должна содержать небольшой раздел кода, который выполняет только операцию, требующую олицетворения. Например, если драйвер обращается к защищенному файлу, он требует олицетворения только при открытии дескриптора файла. Для чтения из файла или записи в него не требуется олицетворение.