Основы программирования в Win32API. Марапулец Ю.В. - 94 стр.

UptoLike

Составители: 

Структура SECURITY_DESCRIPTOR (SD) хранит в себе информацию,
связанную с защитой некоторого объекта от несанкционированного доступа. В
этой структуре содержится информация о том, какие пользователи обладают
правом доступа к объекту и какие действия эти пользователи могут выполнить
в отношении этого объекта. Следует отметить, что внутреннее строение струк-
туры SECURITY_DESCRIPTOR не документировано. Указатель на структуру
SECURITY_DESCRIPTOR в составе структуры SECURITY_ATTRIBUTES яв-
ляется указателем на тип void. Предполагается, что если вы знаете о строении
структуры SECURITY_DESCRIPTOR, значит, теоретически вы можете обойти
систему безопасности.
Дескриптор безопасности объекта хранит в себе следующую информацию:
SID (Security ID) владельца объекта;
SID основной группы владельца объекта;
дискреционный список управления доступом (Discretionary Access
Control List, DACL);
системный список управления доступом (System Access Control List,
SACL);
управляющая информация (например, сведения о том, как списки ACL
передают информацию дочерним дескрипторам безопасности).
Идентификатор безопасности (SID) представляет собой структуру пере-
менной длины, которая однозначно идентифицирует пользователя или группу
пользователей. Внутри идентификатора безопасности (среди прочей информа-
ции) содержится 48-разрядный уникальный код аутентифицированного лица
(пользователя или группы), состоящий из значения уровня доступа, кода ос-
новного лица и кода вторичного лица.
Список DACL определяет, кто обладает (и кто не обладает) правом досту-
па к объекту. Список SACL определяет, информация о каких действиях вно-
сится в файл журнала.
Но как можно создать дескриптор безопасности, если вы не знаете его
структуры? Для этой цели следует использовать системный вызов Initialize-
SecurityDescriptor(). Этой функции следует передать указатель на дескрип-
тор безопасности SECURITY_DESCRIPTOR и значение DWORD, которое
содержит номер ревизии структуры SECURITY_DESCRIPTOR. В качестве
второго аргумента следует использовать значение
SECURITY_DESCRIPTOR_REVISION.
Функция InitializeSecurityDescriptor() инициализирует указанный вами де-
скриптор таким образом, что в нем отсутствует DASL, SACL, владелец и ос-
новная группа владельца, а все управляющие флаги установлены в значение
FALSE. При этом дескриптор имеет абсолютный формат. Что это значит? Де-
скриптор в абсолютном (absolute) формате содержит лишь указатели на ин-
формацию, связанную с защитой объекта. В отличие от этого дескриптор в от-
носительном (self-relative) формате включает в себя всю необходимую
информацию, которая располагается в памяти последовательно, поле за полем.
Таким образом, абсолютный дескриптор нельзя записать на диск (так как при
94
     Структура SECURITY_DESCRIPTOR (SD) хранит в себе информацию,
связанную с защитой некоторого объекта от несанкционированного доступа. В
этой структуре содержится информация о том, какие пользователи обладают
правом доступа к объекту и какие действия эти пользователи могут выполнить
в отношении этого объекта. Следует отметить, что внутреннее строение струк-
туры SECURITY_DESCRIPTOR не документировано. Указатель на структуру
SECURITY_DESCRIPTOR в составе структуры SECURITY_ATTRIBUTES яв-
ляется указателем на тип void. Предполагается, что если вы знаете о строении
структуры SECURITY_DESCRIPTOR, значит, теоретически вы можете обойти
систему безопасности.
     Дескриптор безопасности объекта хранит в себе следующую информацию:
     – SID (Security ID) владельца объекта;
     – SID основной группы владельца объекта;
     – дискреционный список управления доступом (Discretionary Access
Control List, DACL);
     – системный список управления доступом (System Access Control List,
SACL);
     – управляющая информация (например, сведения о том, как списки ACL
передают информацию дочерним дескрипторам безопасности).
     Идентификатор безопасности (SID) представляет собой структуру пере-
менной длины, которая однозначно идентифицирует пользователя или группу
пользователей. Внутри идентификатора безопасности (среди прочей информа-
ции) содержится 48-разрядный уникальный код аутентифицированного лица
(пользователя или группы), состоящий из значения уровня доступа, кода ос-
новного лица и кода вторичного лица.
     Список DACL определяет, кто обладает (и кто не обладает) правом досту-
па к объекту. Список SACL определяет, информация о каких действиях вно-
сится в файл журнала.
     Но как можно создать дескриптор безопасности, если вы не знаете его
структуры? Для этой цели следует использовать системный вызов Initialize-
SecurityDescriptor(). Этой функции следует передать указатель на дескрип-
тор безопасности SECURITY_DESCRIPTOR и значение DWORD, которое
содержит номер ревизии структуры SECURITY_DESCRIPTOR. В качестве
второго         аргумента        следует         использовать       значение
SECURITY_DESCRIPTOR_REVISION.
     Функция InitializeSecurityDescriptor() инициализирует указанный вами де-
скриптор таким образом, что в нем отсутствует DASL, SACL, владелец и ос-
новная группа владельца, а все управляющие флаги установлены в значение
FALSE. При этом дескриптор имеет абсолютный формат. Что это значит? Де-
скриптор в абсолютном (absolute) формате содержит лишь указатели на ин-
формацию, связанную с защитой объекта. В отличие от этого дескриптор в от-
носительном (self-relative) формате включает в себя всю необходимую
информацию, которая располагается в памяти последовательно, поле за полем.
Таким образом, абсолютный дескриптор нельзя записать на диск (так как при

                                     94