Применение дескрипторов безопасности к объекту device
Большинство водителей используют элементы управления доступом, применяемые диспетчером ввода-вывода к объектам устройств, чтобы защитить себя от ненадлежащего доступа. Самый простой подход для большинства драйверов заключается в применении явного дескриптора безопасности при установке драйвера. В INF-файле такие дескрипторы безопасности описываются записью "Безопасность" в разделе AddReg. Дополнительные сведения о полном языке, используемом для описания дескрипторов безопасности, см. в разделе Язык определения дескрипторов безопасности в документации по Microsoft Windows SDK.
Базовый формат дескриптора безопасности, использующий язык определения дескриптора безопасности (SDDL), включает следующие отдельные элементы стандартного дескриптора безопасности:
Идентификатор безопасности владельца.
Идентификатор безопасности группы.
Список управления доступом на уровне пользователей.
Системный список управления доступом.
Таким образом, описание в скрипте INF для дескриптора безопасности:
O:owner-sidG:group-sidD:dacl-flags(ace)(ace)S:sacl-flags(ace)(ace)
Отдельные записи управления доступом описывают доступ, который должен быть предоставлен или запрещен определенной группе или пользователю в соответствии с идентификатором безопасности или идентификатором безопасности. Например, INF-файл может содержать строку, например:
"D:P(A;CI;GR;;;BU)(A;CI;GR;;;PU)(A;CI;GA;;;BA)(A;CI;GA;;;SY)(A;CI;GA;;;NS)(A;CI;GA;;;LS)(A;CI;CCDCLCSWRPSDRC;;;S-1-5-32-556)"
Приведенный выше пример получен из NETTCPIP. INF-файл из системы Microsoft Windows XP с пакетом обновления 1 (SP1).
В этом случае владелец или группа не указаны, поэтому они по умолчанию имеют предопределенные или стандартные значения. Значение D указывает, что это daCL. P указывает, что это защищенный список управления доступом и не наследует никаких прав от дескриптора безопасности содержащего объекта. Защищенный список управления доступом предотвращает наследование более мягких элементов безопасности родительского объекта. Выражение в скобках указывает на одну запись управления доступом (ACE). Запись управления доступом, использующая SDDL, состоит из нескольких отдельных компонентов, разделенных точкой с запятой. По порядку они имеют следующий порядок:
Индикатор типа для ACE. Существует четыре уникальных типа для списков DACL и четыре разных типа для списков SACLs.
Поле флагов, используемое для описания наследования этого ACE для дочерних объектов или политики аудита и сигнализации для списков SACL.
Поле прав указывает, какие права предоставляются или отклоняются ACE. В этом поле можно указать определенное числовое значение, указывающее универсальные, стандартные и определенные права, применимые к этому ACE, или использовать строковое описание общих прав доступа.
Идентификатор GUID объекта, если DACL является структурой ACE, зависящей от объекта.
Наследуемый GUID объекта, если DACL является структурой ACE, относящейся к объекту;
Идентификатор безопасности, указывающий сущность безопасности, к которой применяется этот ACE.
Таким образом, интерпретируя пример дескриптора безопасности, "A", ведущий к ACE, указывает, что это запись "разрешен доступ". Альтернативой является запись "отказано в доступе", которая используется только редко и обозначается начальным символом "D". Поле флагов указывает на наследование контейнера (CI), которое указывает, что этот ACE наследуется вложенными объектами.
Значения полей прав кодируют определенные права, которые включают универсальные и стандартные права. Например, "GR" означает "универсальный доступ на чтение", а "GA" означает "универсальный доступ ко всем", оба из которых являются универсальными правами. Ряд специальных прав следуют этим универсальным правам. В приведенном выше примере "КОПИЯ" указывает на создание дочернего доступа, который зависит от прав файлов и каталогов. Приведенный выше пример также включает другие стандартные права после строки "CC", включая "DC" для удаления дочернего доступа, "LC" для доступа к списку дочерних элементов, "SW" для самостоятельного доступа, "RP" для доступа к свойствам чтения, "SD" для стандартного доступа на удаление и "RC" для доступа к управлению чтением.
Строки записи sid в приведенном выше примере включают "PU" для опытных пользователей, "BU" для встроенных пользователей, "BA" для "встроенных администраторов", "LS" для локальной учетной записи службы, "SY" для локальной системы и "NS" для учетной записи сетевой службы. Таким образом, в приведенном выше примере пользователям предоставляется общий доступ на чтение объекта . В отличие от этого, встроенным администраторам, учетной записи локальной службы, локальной системе и сетевой службе предоставляется универсальный полный доступ (чтение, запись и выполнение). Полный набор всех возможных прав и стандартных строк идентификатора безопасности задокументирован в пакете Windows SDK.
Эти списки управления доступом будут применяться ко всем объектам устройства, созданным заданным драйвером. Драйвер также может управлять параметрами безопасности определенных объектов с помощью новой функции IoCreateDeviceSecure при создании именованного объекта устройства. Функция IoCreateDeviceSecure доступна в Windows XP с пакетом обновления 1 (SP1), Windows Server 2003 и более поздних версий. При использовании IoCreateDeviceSecure дескриптор безопасности, применяемый к объекту устройства, описывается с помощью подмножества полного языка определения дескриптора безопасности, соответствующего объектам устройства.
Цель применения определенных дескрипторов безопасности к объектам устройства заключается в том, чтобы убедиться, что соответствующие проверки безопасности выполняются на устройстве всякий раз, когда приложение пытается получить доступ к самому устройству. Для объектов устройств, содержащих структуру имен (например, пространство имен файловой системы), сведения об управлении доступом к этому пространству имен устройств принадлежат драйверу, а не диспетчеру ввода-вывода.
Интересная проблема в таких случаях заключается в том, как обеспечить безопасность на границе между диспетчером ввода-вывода, отвечающим за проверку доступа к объекту устройства драйвера, и драйвером устройства, который реализует любую политику безопасности, подходящую для драйвера. Как правило, если открываемый объект является именем самого устройства, диспетчер ввода-вывода выполняет полный проверка доступа к объекту устройства непосредственно с помощью его дескриптора безопасности. Однако если открываемый объект указывает путь внутри самого драйвера, диспетчер ввода-вывода будет только проверка, чтобы обеспечить доступ к объекту устройства. Как правило, это право на обход предоставляется, так как большинству потоков предоставлен seChangeNotifyPrivilege, что соответствует предоставлению права обхода в каталог. Устройство, которое не поддерживает структуру имен, обычно запрашивает, чтобы диспетчер ввода-вывода выполнял полный проверка безопасности. Это можно сделать, задав бит FILE_DEVICE_SECURE_OPEN в поле характеристики устройства. Драйвер, включающий сочетание таких объектов устройств, должен задать эту характеристику для тех устройств, которые не поддерживают структуру имен. Например, файловая система установит этот параметр для своего именованного объекта устройства (который не поддерживает структуру именования), но не установит этот параметр для неименованных объектов устройства (например, тома), которые поддерживают структуру именования. Ошибка правильной настройки этого бита является распространенной ошибкой в драйверах и может разрешить недопустимый доступ к устройству. Для драйверов, использующих интерфейс вложения (например, IoAttachDeviceToDeviceStackSafe), бит FILE_DEVICE_SECURE_OPEN устанавливается, если это поле задано на устройстве, к которому подключается драйвер. Таким образом, драйверам фильтров не нужно беспокоиться об этом конкретном аспекте проверки безопасности.