Обход ограничений безопасности в Delphi: использование Access Tokens и SetNamedSecurityInfo для доступа к файлам других процессов
Вопрос, поднятый в текущем запросе, касается проблемы взаимодействия между процессами в операционных системах Windows, один из которых запущен под учетной записью администратора, а другой – под учетной записью обычного пользователя. Задача состоит в том, чтобы обеспечить возможность обмена информацией о пути к исполняемым файлам между этими процессами, несмотря на ограничения безопасности.
Описание проблемы
Имеем два процесса: первый запущен под администраторской учетной записью, второй – под учетной записью пользователя, у которого нет прав на доступ к администрируемым процессам. Процессы должны взаимодействовать, сравнивая пути, откуда они были запущены. Однако второй процесс не может получить информацию о пути к первому. Использование функций CreateToolhelp32Snapshot, OpenProcess с уровнем доступа PROCESS_QUERY_LIMITED_INFORMATION и QueryFullProcessImageName не применимо, так как они работают начиная с Windows Vista и Windows 7, а требуется решение для более старых версий операционной системы.
Альтернативный подход к решению
В качестве альтернативы было предложено рассмотреть возможность изменения логики работы администрируемого процесса. Например, можно использовать общий файл с именем, заданным заранее, для хранения необходимой информации. Этот файл можно поделиться с любым пользователем или группой, при этом рекомендуется предоставить только права на чтение.
Подтвержденное решение
Использование механизма Access Tokens и функции SetNamedSecurityInfo может помочь в решении задачи. Сначала администрируемый процесс может открыть другой процесс, получить его токен и дескриптор безопасности, затем модифицировать список контроля доступа (DACL) для включения новых прав для желаемого пользовательского аккаунта или группы, после чего установить обратно токен и дескриптор безопасности.
Пример кода на Object Pascal (Delphi)
uses SysUtils, Windows;
function GetProcessPath(const ProcessID: cardinal): string;
var
ProcessHandle: THandle;
ProcessName: array[0..(MAX_PATH - 1)] of char;
begin
ProcessHandle := OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, False, ProcessID);
if ProcessHandle <> 0 then
begin
ZeroMemory(@ProcessName[0], SizeOf(ProcessName));
if QueryFullProcessImageName(ProcessHandle, 0, @ProcessName[0], SizeOf(ProcessName)) then
Result := ProcessName;
CloseHandle(ProcessHandle);
end;
end;
Этот код не будет работать для процессов, запущенных под администраторской учетной записью, без соответствующих прав. Следующий пример демонстрирует, как модифицировать токен для предоставления доступа к процессу:
uses Windows;
procedure ModifyTokenToAllowAccess(const ProcessID: DWORD; const UserSID: PSID);
var
ProcessHandle, TokenHandle: THandle;
TokenInfo: TTokenInformation;
Access: PACL;
SD: PSECURITY_DESCRIPTOR;
begin
ProcessHandle := OpenProcess(TOKEN_QUERY, False, ProcessID);
if ProcessHandle <> 0 then
begin
if GetTokenInformation(ProcessHandle, TokenUser, nil, 0, @TokenInfo);
Access := CreateMutableSecurityDescriptor(TokenInfo.User.Sid, True);
// Добавить в ACL необходимые права для UserSID
SD := CreateSecurityDescriptorInSecurityDescriptor(Access, True);
SetEntriesInAuditAndAccessAce(SD, FALSE, UserSID, GENERIC_READ or GENERIC_EXECUTE, NO_INHERITANCE);
// Обновить токен процесса с новым SD
SetTokenInformation(ProcessHandle, TokenSecurityDescriptor, SD, SizeOf(TSECURITY_DESCRIPTOR));
CloseHandle(ProcessHandle);
end;
end;
В этом примере необходимо заменить CreateMutableSecurityDescriptor и SetEntriesInAuditAndAccessAce на реальные функции из Delphi Winapi, которые позволяют работать с токенами доступа и дескрипторами безопасности. Этот код является лишь иллюстрацией и требует дальнейшей реализации и тестирования.
Заключение
Для решения поставленной задачи важно тщательно продумать логику взаимодействия между процессами, а также обеспечить безопасность доступа к информации. Использование Access Tokens и SetNamedSecurityInfo может быть эффективным, но требует глубоких знаний в области безопасности Windows и программирования на Delphi.
Описание контекста: Задача заключается в обходе ограничений безопасности в среде разработки Delphi для обеспечения доступа к файлам процессов, работающих под разными учетными записями, с использованием Access Tokens и функции `SetNamedSecurityInfo`.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.