CreateProcessAsUser и createevent разрешения - PullRequest
1 голос
/ 11 января 2020

Я создаю приложение, которое прослушивает порт, и когда клиент делает запрос, он порождает новый процесс с другим пользователем, используя LogonUser, CreateProcessAsUser.

Я установил 2 события с помощью функции CreateEvent (), чтобы сообщить дочернему элементу, что WSADuplicateSocket готов передать структуру SOCKADD_STORAGEW дочернему процессу через файл отображения памяти.

OpenEvent () в дочернем процессе продолжает сбой с ошибкой 5 (доступ запрещен), когда он порождается из приложения.

Если я вручную запускаю дочерний процесс / клиент, используя (Shift + щелчок правой кнопкой мыши, запустить как), функция OpenEvent успешно удается открыть событие.

Событие создается в глобальном пространстве имен (Global \ myevent), и для целей тестирования я создал нулевой Dacl (я подтвердил разрешение на событие с winobj), переданный в функцию CreateEvent ().

Не понимаю, чего мне не хватает.

здесь соответствующий фрагмент кода:

Сервер:

SECURITY_ATTRIBUTES sa;
CreateNullDacl(&sa);


if ((ghParentFileMappingEvent = CreateEvent(&sa, TRUE, FALSE, szParentEventName)) == NULL) {
    fprintf(stderr, "CreateEvent() failed: %d\n", GetLastError());
    return false;
}

if ((ghChildFileMappingEvent = CreateEvent(&sa, TRUE, FALSE, szChildEventName)) == NULL) {
    fprintf(stderr, "CreateEvent() failed: %d\n", GetLastError());
    CloseHandle(ghParentFileMappingEvent);
    return false;
}





PROCESS_INFORMATION pi = { 0 };
STARTUPINFO si = { 0 };
SECURITY_ATTRIBUTES procSa;
CreateNullDacl(&procSa);

HANDLE htok;
if (!LogonUser(chall->user, ".", chall->pass, LOGON32_LOGON_BATCH, LOGON32_PROVIDER_DEFAULT, &htok)) {
    fprintf(stderr, "LogonUser() failed: %d\n", GetLastError());
    return false;

}


if(CreateProcessAsUser(htok, 0, szChildComandLineBuf, &procSa, 0, FALSE, NULL, NULL, "C:\\Users\\ch99", &si, &pi)) {
 //... 
}

Создан клиент из CreateProcessAsUser ()

 if ((ghParentFileMappingEvent = OpenEventA(SYNCHRONIZE, FALSE, szParentEventName)) == 0)  // return 5 , access denied
{
    fprintf(fp, "OpenParentEvent failed: %d\n", GetLastError());
    return INVALID_SOCKET;
}

if ((ghChildFileMappingEvent = OpenEventA(SYNCHRONIZE, FALSE, szChildEventName)) == 0) { // return 5 access denied
    fprintf(fp, "OpenChildEvent failed: %d\n", GetLastError());
    CloseHandle(ghParentFileMappingEvent);
    ghParentFileMappingEvent = NULL;
    return INVALID_SOCKET;
}

Спасибо за ваш ответ.

Ответы [ 2 ]

1 голос
/ 14 января 2020

После стольких попыток CreateEvent () продолжает возвращать отказано в доступе.

Я нашел уродливый обходной путь: в SECURITY_ATTRIBUTES, переданном CreateEvent (), я установил bInheritHandle в TRUE и передал значение дескриптора дочернему процессу в аргументе.

На данный момент я могу использовать WaitForSingleObject () на дескрипторе.

Мне действительно любопытно узнать, почему это не сработало, как описано в моем первом вопросе ...

0 голосов
/ 14 января 2020

На основе документа CreateProcessAsUser:

Дескриптор первичного токена , представляющего пользователя. Дескриптор должен иметь права доступа TOKEN_QUERY , TOKEN_DUPLICATE и TOKEN_ASSIGN_PRIMARY .

У меня работает следующий код:

if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY, &htok))
    printf("OpenProcessToken() failed: %d\n", GetLastError());
if (!CreateProcessAsUser(htok, L"childProc.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
    printf("CreateProcessAsUser() failed: %d\n", GetLastError());
}

Или вместо этого вы можете использовать CreateProcessWithToken (для этого нужно запускать от имени администратора):

HANDLE htok;
if (!LogonUser(L"userName", L"domain", L"password", LOGON32_LOGON_BATCH, LOGON32_PROVIDER_DEFAULT, &htok)) {
    printf("LogonUser() failed: %d\n", GetLastError());
    return false;
}

if (!CreateProcessWithTokenW(htok, LOGON_WITH_PROFILE,L"childProc.exe", NULL, 0, NULL, NULL, &si, &pi)) {
    printf("CreateProcessAsUser() failed: %d\n", GetLastError());
}

При обоих указанных выше методах дочерний процесс может быть открыт событие успешно .

Для вашего кода я получаю код ошибки 1314 (требуемая привилегия не удерживается клиентом.) при вызове CreateProcessAsUser. Укажите, что мне не хватает, и воспроизведите шаги для вашей проблемы.

...