Мне интересно с точки зрения безопасности, насколько плохо делать то, что я опишу ниже?
Мне нужно запустить процесс с повышенными правами в сеансе пользователя с интерактивным входом в систему из локальной службы. Этот процесс просто существует как только сообщений Окно графического интерфейса пользователя, которое никогда не видимо пользователю, и его имя класса выбирается случайным образом при каждом запуске процесса.
Это ускоряет процесс, если я запускаю этот процесс с токеном пользователя локальной службы как таковой:
//Pseudo-code, error checks are omitted for brevity
//This code is run from a local-service with SYSTEM credentials
PSID gpSidMIL_High;
ConvertStringSidToSid(L"S-1-16-12288", &gpSidMIL_High);
HANDLE hToken, hToken2;
OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken);
DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hToken2);
SetTokenInformation(hToken2, TokenSessionId, &userSessionID, sizeof(userSessionID));
DWORD dwUIAccess = 1;
SetTokenInformation(hToken2, TokenUIAccess, &dwUIAccess, sizeof(dwUIAccess));
//Set "high" mandatory integrity level
TOKEN_MANDATORY_LABEL tml = {0};
tml.Label.Attributes = SE_GROUP_INTEGRITY;
tml.Label.Sid = gpSidMIL_High;
SetTokenInformation(hToken2, TokenIntegrityLevel, &tml, sizeof(TOKEN_MANDATORY_LABEL) + ::GetSidLengthRequired(1));
CreateEnvironmentBlock(&pEnvBlock, hToken2, FALSE);
ImpersonateLoggedOnUser(hToken2);
CreateProcessAsUser(hToken2,,,,,,,pEnvBlock,,);
RevertToSelf();
//Clean-up
DestroyEnvironmentBlock(pEnvBlock);
CloseHandle(hToken2);
CloseHandle(hToken);
LocalFree(gpSidMIL_High);
Выглядит довольно плохо. У процесса слишком много прав. Процесс рискует быть угнанным пользователем, в сеансе которого вы запускаете, что даст ему SYSTEM
прав, которыми он вообще не владеет.
Надлежащая конструкция должна быть способна ничего не делать. Сообщите о событиях клавиатуры обратно в сервис. Ваш крючок не должен быть SYSTEM
за это. Это, вероятно, целесообразно позвонить AdjustTokenPrivileges
безвозвратно отбросить все привилегии (которые вам не нужны). Даже если ваш хук процесс был взломан, он не сможет восстановить эти привилегии.
Других решений пока нет …