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 に答える