制限付きトークン
制限付きトークンは、CreateRestrictedToken 関数によって変更されたプライマリ または偽装アクセス トークンです。 制限付きトークンのセキュリティ コンテキストで実行されているプロセスまたは偽装スレッドは、セキュリティ保護可能なオブジェクトにアクセスしたり、特権操作を実行したりする機能が制限されます。 CreateRestrictedToken 関数は、次の方法でトークンを制限できます。
- トークンから 特権を 削除します。
- トークン内の SID に deny-only 属性を適用して、セキュリティで保護されたオブジェクトへのアクセスに使用できないようにします。 拒否専用属性の詳細については、「 アクセス トークンの SID 属性」を参照してください。
- セキュリティ保護可能なオブジェクトへのアクセスを制限できる、制限する SID の一覧を指定します。
システムは、セキュリティ保護可能なオブジェクトへのトークンのアクセスをチェックするときに、SID の制限の一覧を使用します。 制限付きプロセスまたはスレッドがセキュリティ保護可能なオブジェクトにアクセスしようとすると、システムは 2 つのアクセス チェックを実行します。1 つはトークンが有効な SID を使用し、もう 1 つは制限 SID の一覧を使用します。 両方のアクセス チェックで要求されたアクセス権が許可されている場合にのみ、アクセスが許可されます。 アクセス チェックの詳細については、「 DACLs がオブジェクトへのアクセスを制御する方法」を参照してください。
CreateProcessAsUser 関数の呼び出しでは、制限付きプライマリ トークンを使用できます。 通常、 CreateProcessAsUser を呼び出すプロセスには、SE_ASSIGNPRIMARYTOKEN_NAME特権が必要です。これは通常、システム コードまたは LocalSystem アカウントで実行されているサービスによってのみ保持されます。 ただし、 CreateProcessAsUser 呼び出しで呼び出し元のプライマリ トークンの制限付きバージョンが指定されている場合、この特権は必要ありません。 これにより、通常のアプリケーションで制限されたプロセスを作成できます。
また、ImpersonateLoggedOnUser 関数で制限付きプライマリ トークンまたは偽装トークンを使用することもできます。
トークンに制限 SID の一覧があるかどうかを確認するには、 IsTokenRestricted 関数を呼び出します。
Note
制限付きトークンを使用するアプリケーションでは、既定のデスクトップ以外のデスクトップで制限付きアプリケーションを実行する必要があります。 これは、 SendMessage または PostMessage を使用して、既定のデスクトップ上の無制限のアプリケーションに対する制限付きアプリケーションによる攻撃を防ぐために必要です。 必要に応じて、アプリケーションの目的でデスクトップを切り替えます。