从安全angular度来看,我很好奇,做下面描述的有多糟糕?
我需要在本地服务的交互式login用户会话中启动一个高级进程。 这个过程仅仅作为一个消息的 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);
看起来很糟糕。 这个过程有太多的权利。 该进程有被用户运行的用户劫持的风险,这将使他拥有通常不拥有的SYSTEM
权限。
正确的设计是让钩子过程无能为力。 将键盘事件传回服务。 你的钩子不需要是这个SYSTEM
。 调用AdjustTokenPrivileges
不可撤销地删除所有权限(您不需要)可能是明智的。 即使你的钩子程序被劫持,也不能重新获得这些特权。