Прогон программы получения информации из дескриптора защиты файла

В качестве примера рассмотрим программу, задача которой - получение текстового значения Sid владельца файла из дескриптора защиты файла.

#define _WIN32_WINNT 0x0500

#ifndef UNICODE

#define UNICODE

#endif

#include <windows.h>

#include <stdio.h>

#include <sddl.h>

#include <Aclapi.h>

void main(void){

PSID pSid;

PSECURITY_DESCRIPTOR pSD;

PACL pDACL;

LPTSTR StringSid = NULL;

ULONG Error;

HANDLE hFile;

hFile = CreateFile(TEXT("MyFile.txt"), READ_CONTROL, 0, NULL, OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL, NULL);

Error = GetSecurityInfo(hFile,

SE_FILE_OBJECT, // тип объекта

OWNER_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION,

&pSid, // Sid владельца

NULL, // Sid группы

&pDACL, NULL, // списки прав доступа

&pSD // дескриптор защиты);

if(Error != ERROR_SUCCESS) printf("GetSecurityInfo Error\n");

if (!ConvertSidToStringSid(pSid, &StringSid)) /* память для строки выделяет сама функция */

printf("Convert SID to string SID failed.");

wprintf(L"StringSid %s\n", StringSid);

LocalFree(pSD);

LocalFree(StringSid);

}

Задача данной программы - открыть существующий файл MyFile.txt и применить функцию GetSecurityInfo для извлечения идентификатора безопасности владельца из дескриптора защиты файла. Затем идентификатор преобразуется в текстовую форму и выводится на экран.

Написание, компиляция и прогон программы получения списка контроля доступа к файлу из его дескриптора защиты

На основе предыдущей программы рекомендуется написать программу, которая выводит на экран список прав доступа к обозначенному файлу.

Субъекты безопасности. Процессы, потоки. Маркер доступа

Так же как и объекты, субъекты должны иметь отличительные признаки - контекст пользователя, для того, чтобы система могла контролировать их действия. Сведения о контексте пользователя хранятся в маркере (употребляются также термины "токен", "жетон") доступа. При интерактивном входе в систему пользователь обычно вводит свое имя и пароль. Система (процедура Winlogon) по имени находит соответствующую учетную запись, извлекает из нее необходимую информацию о пользователе, формирует список привилегий, ассоциированных с пользователем и его группами, и все это объединяет в структуру данных, которая называется маркером доступа. Маркер также хранит некоторые параметры сессии, например, время окончания действия маркера. Таким образом, именно маркер является той визитной карточкой, которую субъект должен предъявить, чтобы осуществить доступ к какому-либо объекту.

Вслед за оболочкой (Windows Explorer) все процессы (а также все потоки процесса), запускаемые пользователем, наследуют этот маркер. Когда один процесс создает другой при помощи функции CreateProcess, дочернему процессу передается дубликат маркера, который, таким образом, распространяется по системе.

Основные компоненты маркера доступа показаны на рис. 13.2.

Прогон программы получения информации из дескриптора защиты файла - student2.ru

Рис. 13.2. Основные компоненты маркера доступа

Включая в маркер информацию о защите, в частности, DACL, Windows упрощает создание объектов со стандартными атрибутами защиты. Как уже говорилось, если процесс не позаботится о том, чтобы явным образом указать атрибуты безопасности объекта, на основании списка DACL, присутствующего в маркере, будут сформированы права доступа к объекту по умолчанию. Настройку стандартной защиты можно осуществить при помощи функции SetTokenInformation. При этом, поскольку объекты в Windows отличаются большим разнообразием, в списке DACL "по умолчанию" можно указать только так называемые базовые права доступа, из которых система будет формировать стандартные права доступа в зависимости от вида создаваемого объекта. То, как это делается и как сформировать список DACL, по умолчанию присутствующий в маркере, подробно описано в [4], [5].

Задание

Осуществить просмотр данных маркера доступа с помощью утилиты WhoAmi

Если процесс обладает правом TOKEN_QUERY доступа к объекту, то большую часть содержимого маркера можно считать при помощи функции GetTokenInformation. Чтобы получить описатель маркера, необходимо воспользоваться функцией OpenProcessToken.

В качестве примера рассмотрим программу, задача которой - получение текстового значения Sid владельца процесса из маркера доступа данного процесса.

#define _WIN32_WINNT 0x0500

#ifndef UNICODE

#define UNICODE

#endif

#include <windows.h>

#include <stdio.h>

#include <sddl.h>

void main(void){

DWORD TokenUserBufSize=256;

LPTSTR StringSid;

TOKEN_USER *ptUser;

HANDLE hHeap;

HANDLE hToken = NULL;

hHeap = GetProcessHeap();

ptUser = (TOKEN_USER *)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, TokenUserBufSize);

if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))

printf("OpenProcessToken Error\n");

if (!GetTokenInformation(hToken, // описатель маркера доступа

TokenUser, // нужна информация о пользователе

ptUser, // буфер для информации

TokenUserBufSize, &TokenUserBufSize))

printf("GetTokenInformation Error\n");;

if (!ConvertSidToStringSid(ptUser->User.Sid, &StringSid))

printf("Convert SID to string SID failed.");

wprintf(L"StringSid %s\n", StringSid);

CloseHandle(hToken);

LocalFree(StringSid);

HeapFree(hHeap,0,ptUser);

}

Задача данной программы - получить описатель текущего процесса при помощи функции OpenProcessToken и применить функцию GetTokenInformation для извлечения из него идентификатора безопасности владельца. После чего идентификатор преобразуется в текстовую форму и выводится на экран.

В следующей лекции будет приведен пример программы получения из маркера доступа информации о привилегиях пользователя.

Наши рекомендации