Поделиться через


Управление доступом к устройству в драйверах KMDF

Драйверы должны помочь предотвратить неуместный доступ пользователей к устройствам и файлам компьютера. Чтобы предотвратить несанкционированный доступ к устройствам и файлам, необходимо:

  • При необходимости назовите объекты устройства.

  • Предоставьте дескрипторы безопасности для объектов и интерфейсов устройства.

Именование Объектов Устройств Только При Необходимости

Как и большинство драйверов модели драйверов Windows (WDM), фреймворк-ориентированные драйверы обычно не называют свои объекты устройства. Приложения могут получить доступ к устройству, указав имя объекта устройства, поэтому каждое дополнительное имя объекта устройства представляет дополнительный путь, который приложение может использовать для доступа к устройству.

Чтобы предотвратить несанкционированный доступ к устройству, каждый драйвер может указать дескриптор безопасности при именовании объекта устройства. Однако имя файла, которое операционная система предоставляет драйверу (см. WdfFileObjectGetFileName) не включает имя объекта устройства, используемое приложением. Таким образом, если несколько драйверов в стеке драйверов предоставляют имена для своих объектов устройства, драйвер не может определить имя объекта, используемое приложением для открытия устройства. В результате приложение может открыть устройство с менее строгим дескриптором безопасности, чем ожидает драйвер.

Объекты физических устройств (PDOS) должны иметь имена. Как правило, драйверы шины на основе платформы не указывают имя PDO, так как платформа (по умолчанию) указывает операционной системе создать имя.

С другой стороны, драйвер на основе платформы может назначить имя устройства объекту устройства, вызвав WdfDeviceInitAssignName. Драйвер должен назвать функциональный объект устройства (FDO), фильтровать объект устройства (фильтр DO) или PDO только в том случае, если драйвер должен поддерживать старое приложение, ожидающее определенное имя устройства, или если драйвер принадлежит старой стеку драйверов, архитектура которого требует имен объектов.

Вместо именования FDOs и фильтров DOs драйверы WDM и драйверы на базе фреймворка должны предоставлять интерфейсы устройств, к которым могут обращаться приложения. Операционная система получает дескриптор безопасности интерфейса устройства из PDO устройства и из записей реестра, которые указывает INF-файл пакета драйвера. Драйвер шины может предоставлять интерфейсы устройств для PDO, если устройства под управлением драйвера работают в необработанном режиме без функционального драйвера.

Некоторые драйверы должны вызывать WdfDeviceCreateSymbolicLink для создания имен символьных ссылок для своих устройств. Например, драйвер может создать MS-DOS имя устройства, если приложения ожидают видеть MS-DOS имя устройства. Если драйвер создает символьное имя ссылки для неименованного FDO или фильтра DO, платформа связывает символьное имя ссылки с именем PDO. (Устройства управления не связаны с PDO, поэтому драйвер не может создать символьное имя ссылки для неназванного устройства управления.)

предоставление дескрипторов безопасности для объектов и интерфейсов устройств

Каждый именованный объект устройства должен иметь дескриптор безопасности. Операционная система использует дескриптор безопасности объекта устройства для определения типов пользователей, которым разрешен доступ к устройству и его интерфейсам устройств. Дескрипторы безопасности можно назначить объектам устройств:

  • Операционная система, которая предоставляет дескриптор безопасности по умолчанию для объектов устройств (см. управление доступом к устройствам).

  • Фреймворк предоставляет дескриптор безопасности по умолчанию (используя значение SDDL_DEVOBJ_SYS_ALL_ADM_ALL), если ваш драйвер вызывает WdfDeviceInitAssignName, чтобы назначить имя объекту устройства (см. SDDL для объектов устройств).

  • Ваш драйвер, который может переопределить дескриптор безопасности по умолчанию фреймворка, вызвав WdfDeviceInitAssignSDDLString.

По умолчанию операционная система также использует дескриптор безопасности PDO устройства для определения прав доступа к интерфейсам устройств, предоставляемым драйвером.

Пакет драйвера может предоставить INF-файл, указывающий дескрипторы безопасности устройства с директивой AddReg INF в разделе DDInstall.HW INF.

Дополнительные сведения об указании дескрипторов безопасности в INF-файлах см. в создании безопасных установок устройств.

Если драйвер создает pdos для устройств, работающих в необработанном режиме, драйвер должен указать класс установки устройства при вызове WdfPdoInitAssignRawDevice. Кроме того, если драйвер создает устройства управления, он может вызывать WdfDeviceInitSetDeviceClass, чтобы указать класс установки устройства. В обоих случаях системные администраторы могут использовать ключ реестра указанного класса установки для хранения дескрипторов безопасности для конкретного устройства.

Сведения о том, как операционная система определяет, какой дескриптор безопасности используется для устройства, см. в управлении доступом к устройству.

Когда платформа создает объект устройства, он всегда задает флаг FILE_DEVICE_SECURE_OPEN таким образом, чтобы операционная система проверяла дескриптор безопасности устройства, прежде чем разрешить приложению получать доступ к любым именам в пространстве имен устройства. Дополнительные сведения о флаге FILE_DEVICE_SECURE_OPEN и пространстве имен устройства см. в управлении доступом к пространству имен устройств.