2016-07-18 34 views
0

보안 관점에서 궁금합니다. 아래에서 설명하는 것을 수행하는 것이 얼마나 나쁜가요?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); 
+1

저는이 분야에 대해 전문가가 아니기 때문에 질문에 답하는 것을 삼가 겠지만, 의미있는 대답을 얻으려면 상승 된 프로세스가하는 일에 대해 더 잘 설명해야한다고 생각합니다. 특히 윈도우 메시지가 처리되는 방식. –

+0

@HarryJohnston : [WH_KEYBOARD_LL] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms644985(v=vs.85) .aspx) 훅에 대한 메시지를 처리하는 데 사용됩니다. – c00000fd

+1

모든 강력한 숨겨진 키로거. 무엇이 잘못 될 수 있습니까? –

답변

0

이 아주 나쁜 보이는 : 나는 같은 지역 서비스의 사용자 토큰을 사용하여이 프로세스를 실행하면

그것은 일을 속도가 빨라집니다. 프로세스가 너무 많은 권한을 가지고 있습니다. 이 프로세스는 사용자가 실행 한 세션의 사용자가 도용 당할 위험에 놓이게되므로 일반적으로 자신이 소유하지 않은 권리 인 SYSTEM이 부여됩니다.

적절한 디자인은 후크 프로세스가 아무 것도 할 수 없도록하는 것입니다. 키보드 이벤트를 다시 서비스에 전달하십시오. 귀하의 후크가 이것을 위해 SYSTEM 일 필요는 없습니다. AdjustTokenPrivileges에 전화하여 모든 권한을 취소 할 수 없게 삭제하는 것이 좋습니다 (필요하지 않음). 후크 프로세스가 도용 된 경우에도 해당 권한을 다시 얻을 수는 없습니다.

+0

대화식 사용자가 이미 관리자 권한을 가지고있는 경우에만 OP가 관리자 권한을 필요로하는 자체 연결이되었습니다 (http://stackoverflow.com/q/38429078/886887). 나는 궁금한데, 합리적인 ACL을 가진 높은 무결성 프로세스에 대한 알려진 * 공격 벡터가 있습니까? 아니면 심층 방어의 사례일까요? –

+0

흠. 그래, 내가'AdjustTokenPrivileges' 권한을 떨어 뜨릴 수 있는지 모르겠지만. 그럴 수있어? 단지'SYSTEM' 사용자 토큰이 admin 그룹의 프로세스 멤버쉽과'local system' 그룹을 제공하지만 주입 된 코드가 할 수있는 많은 "불쾌한"것들을위한 문을 열어줍니다. – c00000fd

+0

@ c00000fd : [It can] (http://stackoverflow.com/questions/1533017/dropping-privileges-in-c-on-windows). – MSalters