3

プロセスの特権を収集するログ サービスを作成しており、各プロセス特権の属性を理解しようとしています。このコードで説明しましょう:

HANDLE hToken;
if(OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &hToken))
{
    DWORD dwSize = 0;
    if(!GetTokenInformation(hToken, TokenPrivileges, NULL, dwSize, &dwSize) &&
        ::GetLastError() == ERROR_INSUFFICIENT_BUFFER)
    {
        BYTE* pb = new (std::nothrow) BYTE[dwSize];
        if(pb)
        {
            TOKEN_PRIVILEGES* pTPs = (TOKEN_PRIVILEGES*)pb;
            DWORD dwSize2;
            if(GetTokenInformation(hToken, TokenPrivileges, pTPs, dwSize, &dwSize2) &&
                dwSize2 <= dwSize)
            {
                for(UINT i = 0; i < pTPs->PrivilegeCount; i++)
                {
                    //Analyze privilege attributes to understand if it's enabled or disabled?
                    DWORD dwPrivAttr = pTPs->Privileges[i].Attributes;

                    //...
                }
            }

            delete[] pb;
        }
    }

    CloseHandle(hToken);
}

それでは、 TOKEN_PRIVILEGESの構造を見てみましょうLUID_AND_ATTRIBUTES。具体的には次のとおりです。

#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
#define SE_PRIVILEGE_ENABLED            (0x00000002L)
#define SE_PRIVILEGE_REMOVED            (0X00000004L)
#define SE_PRIVILEGE_USED_FOR_ACCESS    (0x80000000L)

ビットマスクとして定義されているように見えますが、これらのフラグの解釈について次のような疑問が生じます。

  1. ENABLEDとはどう違いENABLED_BY_DEFAULTますか?

  2. それは何ですかSE_PRIVILEGE_USED_FOR_ACCESS、どのように使用できますか?

  3. と の両方が設定されている場合はどうSE_PRIVILEGE_ENABLEDなりますか? SE_PRIVILEGE_REMOVEDそれともリセット?

  4. 簡単なテストを実行したところ、私のプロセスでは、SeShutdownPrivilege特権にこれらの属性が として設定されていました0。それで、それはどういう意味ですか?

私はこの構造についてもっと混乱していますが、今のところこれらの点だけにとどめておきます.

ありがとうございました!

4

2 に答える 2

4

質問を順番に受け取るには:

  1. ENABLED_BY_DEFAULT特権は、プロセスの開始時に有効になる特権の 1 つであることを意味します。持っていても持ってENABLEDいないENABLED_BY_DEFAULT場合は、プロセスが特権を明示的に有効にしています。持っていても持ってENABLED_BY_DEFAULTいないENABLED場合は、プロセスが特権を明示的に無効にしています。

  2. ドキュメントによるとSE_PRIVILEGE_USED_FOR_ACCESS、権限が実際に使用されるたびに設定されます。たとえば、実際には使用していない特権を設定していることを検出したり、特定のシステム コールに必要な特権を実験的に決定したりするために、これをトラブルシューティングに使用できます。(これが実際に文書化されたとおりに動作するかどうかを確認したことはありませんが、そうでないと考える理由はありません。)

  3. SE_PRIVILEGE_ENABLEDとの両方SE_PRIVILEGE_REMOVEDが設定されている場合は、Windows にバグがあります。:-)

    どちらも設定されていない場合SE_PRIVILEGE_ENABLEDSE_PRIVILEGE_REMOVED特権はトークンに存在し、削除されていませんが、現在有効になっていません。AdjustTokenPrivileges()で有効化 (または削除) できます。

  4. 属性がゼロの場合、特権はトークンに存在しますが、現在有効になっておらず、削除されておらず、デフォルトで有効になっておらず、プロセスで使用されていません。

于 2015-04-05T03:17:38.193 に答える
0

私たちの中には、特権には 2 つだけでなく、3 つの可能な状態があることを明示的に伝える必要があるかもしれません。このようなことを調査し始めたとき、プロセスには特権があるか、ないかのどちらかだと思いました。しかし、プロセスに特権があっても、無効な状態になる可能性があることがわかりました。つまり、 disabled != にはありません。

残りは論理的に続きます。プロセスのアクセス トークンに特権が存在しない場合、プロセスにはその特権がありません。逆に、プロセスに特権がない場合、特権はトークンに存在しません。

プロセスが特権を持っている場合、プロセスはそれを自由に有効または無効にできますよね? なぜこれが役立つのですか?わかりました、これにより、ライブラリ関数が何をするかを完全に知らずに呼び出すことができ、思った以上のことをすると関数が失敗する可能性があると推測できます...奇妙なことです。

于 2016-06-17T16:47:30.330 に答える