0

从安全的角度来看,我很好奇,做我下面描述的事情有多糟糕?

我需要在本地服务的交互式登录用户会话中启动提升的进程。这个进程仅仅作为一个只显示消息的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);
4

1 回答 1

0

看起来很糟糕。这个过程有太多的权利。该过程有被您在其会话中运行的用户劫持的风险,这将赋予SYSTEM他通常不拥有的权利。

正确的设计是让钩子进程什么都不做。将键盘事件传回给服务。你的钩子不需要SYSTEM 为此。调用AdjustTokenPrivileges不可撤销地放弃所有特权(您不需要)可能是明智的。即使您的钩子进程被劫持,它也无法重新获得这些权限。

于 2016-07-18T10:47:30.383 回答