Железобетонные объекты

Фленов Михаил aka Horrific

Хакер, номер #092, стр. 092-113-1

http://www.vr-online.ru

Дескрипторы и идентификаторы безопасности

Очень часто, программно создавая объекты, мы не задумываемся о безопасности, оставляя ее параметры на усмотрение ОС. Но ведь управление правами доступа не такая уж и сложная операция и требует всего нескольких лишних строчек кода и понимания работы соответствующих функций. Знание функций управления доступом может пригодиться не только при создании объектов, поэтому сегодня мы решили рассказать тебе про SID, Security Attributes, Security Descriptor и обо всем, что связано с этими понятиями.

Атрибуты безопасности

Начнем рассмотрение темы с самого конца, а именно – с функции создания файла или директории. У обеих функций есть одинаковый параметр – указатель на структуру SECURITY_ATTRIBUTES. У функции CreateFile этот указатель четвертый по счету, а у CreateDirectory – второй. Как я уже сказал, в большинстве случаев это поле просто игнорируют, но давайте посмотрим, как его можно корректно заполнить.

Что это за структура? Она определяет атрибуты безопасности и состоит всего из трех полей:

КОД

PSecurityAttributes = ^TSecurityAttributes;

_SECURITY_ATTRIBUTES = record

nLength: DWORD;

lpSecurityDescriptor: Pointer;

bInheritHandle: BOOL;

end;

Первое поле определяет размер структуры. Подобные поля можно встретить в большинстве WinAPI-структур. Второе поле – указатель на дескриптор безопасности. Третий параметр – булевое значение, которое определяет, может ли полученный указатель наследоваться дочерними процессами. Наследование дескрипторов нас не интересует и выходит за рамки этой статьи, поэтому в примере, который мы будем рассматривать, установим это значение в false.

Самое интересное — это второй параметр, на котором следует заострить особое внимание. Это указатель на дескриптор безопасности, который на самом деле ничего страшного собой не представляет.

Дескриптор безопасности

Для каждого объекта ОС создает дескриптор безопасности, по которому определяется права доступа к объекту, его владелец, группа, а также списки SACL (System Access Control List) и DACL (Discretionary Access Control List). Мы рассматриваем программирование, поэтому сделаем упор на рассмотрение самих функций. Если тебя интересует теория безопасности ОС Windows, то следует почитать книжку из серии для админов. Я думаю, там должна быть освещена эта тема.

Итак, давай посмотрим, что такое дескриптор, с точки зрения программирования. На самом деле, это структура, которая имеет следующий вид:

КОД

PSecurityDescriptor = ^TSecurityDescriptor;

_SECURITY_DESCRIPTOR = record

Revision: Byte;

Sbz1: Byte;

Control: SECURITY_DESCRIPTOR_CONTROL;

Owner: PSID;

Group: PSID;

Sacl: PACL;

Dacl: PACL;

end;

В файле помощи эта структура описана только общими словами. Из чего она состоит, можно определить только по заголовочному файлу windows.pas.

Давай рассмотрим, что представляют собой эти поля. Это позволит нам лучше понять дескриптор и его работу.

Revision – ревизия. Этот параметр должен быть равен единице, а лучше использовать константу SECURITY_DESCRIPTOR_REVISION. На одном из сайтов (не российских, потому что в рунете я нормального описания этой темы не видел) утверждается, что можно указывать еще константу SECURITY_DESCRIPTOR_REVISION1 — мол, она предоставляет доступ к новым возможностям. Уверяю тебя, что это полный бред, потому что обе константы в файле windows.pas равны 1, то есть идентичны.

Содержание  Вперед на стр. 092-113-2
ttfb: 3.5250186920166 ms