Список управления доступом
Список управления доступом (ACL) — это список записей управления доступом ( ACEs), созданных операционной системой для управления поведением безопасности, связанным с определенным (защищенным) объектом определенного типа. В Windows есть два типа списков управления доступом:
Дискреционный список ACL — это список нулевых или более acEs, описывающих права доступа для защищенного объекта. Это дискреционная, так как предоставленный доступ предоставляется по усмотрению владельца или любого пользователя с соответствующими правами.
Системный список ACL — это список нулевых или более ACEs, описывающих политику аудита и сигнализации для защищенного объекта.
Термин "дискреционный" относится к различиям между обязательным и дискреционным контролем. В среде, в которой используются обязательные элементы управления, владелец объекта может не предоставить доступ к объекту. В дискреционной среде, например Windows, владелец объекта может предоставить такой доступ. Обязательные элементы управления обычно связаны с жесткими средами безопасности, такими как использование секционной безопасности, где система должна предотвратить раскрытие конфиденциальной информации между пользователями в одной системе.
Драйвер, создающий ACL, выполняет несколько ключевых действий.
Выделение хранилища для ACL.
Инициализация ACL.
Добавьте к списку ACL ноль (или более).
В следующих примерах кода показано, как создать ACL:
dacl = ExAllocatePool(PagedPool, PAGE_SIZE);
if (!dacl) {
return;
}
status = RtlCreateAcl(dacl, PAGE_SIZE, ACL_REVISION);
if (!NT_SUCCESS(status)) {
ExFreePool(dacl);
return;
}
Предыдущий фрагмент кода создает пустой список ACL. В примере кода выделяется значительный объем памяти, так как мы не знаем размер, необходимый для ACL.
На этом этапе ACL пуст, так как у него нет записей ACE. Пустой ACL запрещает доступ любому пользователю, пытающемуся получить доступ к объекту, так как отсутствуют записи, предоставляющие такой доступ. Следующий фрагмент кода добавляет ACE в этот ACL:
status = RtlAddAccessAllowedAce(dacl, ACL_REVISION, FILE_ALL_ACCESS, SeExports->SeWorldSid);
if (!NT_SUCCESS(status)) {
ExFreePool(dacl);
return;
}
Добавленный ACE предоставляет доступ к любой сущности, которая обращается к объекту, которая является целью идентификатора безопасности доступа мира (SeWorldSid). Обычно этот идентификатор безопасности представлен как "Все" в других системных служебных программ Windows.
При создании списков управления доступом важно разместить записи ACE с запретом доступа в начале ACL и получить доступ к разрешенным записям ACE в конце ACL. Этот порядок важен. В противном случае монитор ссылок на безопасность предоставит доступ, если он находит доступ, разрешенный для доступа, перед отказом доступа ACE при оценке ACL. Это поведение хорошо задокументировано в пакете SDK для Microsoft Windows, но оно относится к конкретному механизму, который монитор ссылок на безопасность использует для определения того, следует ли предоставить или запретить доступ.