受限令牌

受限令牌是由 CreateRestrictedToken 函数修改的主要或模拟访问令牌。 在受限令牌的安全上下文中运行的进程或模拟线程访问安全对象或执行特权操作的能力受到限制。 CreateRestrictedToken 函数可以通过以下方式限制令牌:

  • 从令牌中删除 特权
  • 将 deny-only 属性应用于令牌中的 SID,以便它们不能用于访问受保护的对象。 有关“仅拒绝”属性的详细信息,请参阅 访问令牌中的 SID 属性
  • 指定限制 SID 的列表,该列表可以限制对安全对象的访问。

系统在检查令牌对安全对象的访问权限时使用限制 SID 列表。 当受限进程或线程尝试访问安全对象时,系统将执行两个访问检查:一个使用令牌的已启用 SID,另一个使用限制 SID 列表。 仅当两个访问检查都允许请求的访问权限时,才授予访问权限。 有关访问检查的详细信息,请参阅 DACL 如何控制对对象的访问

可以在调用 CreateProcessAsUser 函数时使用受限的主令牌。 通常,调用 CreateProcessAsUser 的进程必须具有SE_ASSIGNPRIMARYTOKEN_NAME特权,该特权通常仅由系统代码或在 LocalSystem 帐户中运行的服务持有。 但是,如果 CreateProcessAsUser 调用指定调用方主令牌的受限版本,则不需要此权限。 这使普通应用程序能够创建受限的进程。

还可以在 ImpersonateLoggedOnUser 函数中使用受限的主令牌或模拟令牌

若要确定令牌是否具有限制 SID 的列表,请调用 IsTokenRestricted 函数。

注意

使用受限令牌的应用程序应在默认桌面以外的桌面上运行受限制的应用程序。 这是防止受限制的应用程序(使用 SendMessagePostMessage)攻击默认桌面上不受限制的应用程序所必需的。 如有必要,请出于应用程序目的在桌面之间切换。