보안 관점에서 궁금합니다. 아래에서 설명하는 것을 수행하는 것이 얼마나 나쁜가요?SYSTEM 사용자 토큰으로 로그온 사용자 프로세스를 시작하면 시스템의 보안이 위험에 처하게됩니까?
로컬 서비스의 대화 형 로그온 사용자 세션에서 승격 된 프로세스를 실행해야합니다. 이 프로세스는 단지 사용자가 볼 수없는 message-only GUI 창으로 존재하며 프로세스가 시작될 때마다 클래스 이름이 무작위로 지정됩니다.
//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);
저는이 분야에 대해 전문가가 아니기 때문에 질문에 답하는 것을 삼가 겠지만, 의미있는 대답을 얻으려면 상승 된 프로세스가하는 일에 대해 더 잘 설명해야한다고 생각합니다. 특히 윈도우 메시지가 처리되는 방식. –
@HarryJohnston : [WH_KEYBOARD_LL] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms644985(v=vs.85) .aspx) 훅에 대한 메시지를 처리하는 데 사용됩니다. – c00000fd
모든 강력한 숨겨진 키로거. 무엇이 잘못 될 수 있습니까? –