假冒

【勇芳软件工作室】汉化HomePreviousNext

【模拟】是线程在与拥有线程的进程不同的安全上下文中执行的能力。通常,服务器应用程序中的线程会模拟客户端。这允许服务器线程代表该客户端来访问对象或验证对其自己的对象的访问。例如,当DDE会话中的客户端请求来自DDE服务器的信息时,服务器可以模拟客户端,以便系统可以验证客户端是否被允许访问该信息。

Win32 API为线程开始模拟提供了几种方法:

* DDE服务器应用程序可以调用DdeImpersonateClient函数来模拟客户端。

*命名管服务器可以调用ImpersonateNamedPipeClient函数。

*您可以调用ImpersonateLoggedOnUser函数来模拟指定用户的安全上下文。

* ImpersonateSelf功能使线程能够生成自己的访问令牌的副本。当应用程序需要更改单个线程的安全上下文时,这很有用。例如,有时只有一个进程的线程需要特殊权限。

*您可以调用SetThreadToken函数来使目标线程在指定的模拟令牌的安全上下文中运行。

在所有这些情况下,模拟线程可以通过调用RevertToSelf函数恢复到自己的安全上下文。

RPC服务器可以调用RpcImpersonateClient函数来模拟客户端。RPC服务器调用RpcRevertToSelfRpcRevertToSelfEx以恢复为服务器线程定义的安全上下文。

当线程模拟用户时,线程的大多数动作都是在线程的模拟令牌的安全上下文中完成的,而不是拥有该线程的进程的主令牌。例如,服务器进程的单独线程可以模拟客户端以验证客户端是否被允许访问安全对象。但是,一些操作始终使用进程的安全上下文来完成。例如,如果假冒线程调用CreateProcess函数,则新进程将继承进程的主令牌,而不是调用线程的模拟令牌。类似地,系统总是使用进程的主令牌来验证需要SE_TCB_NAME特权的操作。

要创建在模拟用户的安全上下文中运行的新进程,可以使用DuplicateTokenExCreateProcessAsUser函数。在典型情况下,服务器线程通过调用其中一个模拟函数(例如ImpersonateNamedPipeClient)来模拟客户端。仿冒线程然后调用OpenThreadToken函数来获取自己的令牌,这是一个具有客户端安全上下文的模拟令牌。线程然后调用DuplicateTokenEx将其模拟令牌转换为主令牌。然后,您可以在调用CreateProcessAsUser中传递此主令牌。请注意,此方法创建的进程可能无法访问网络。这是因为Windows NT身份验证不会从客户端向服务器发送密码,因此新进程没有与第三台计算机建立网络连接的凭据。

LogonUser功能为模拟用户提供了另一种方法。如果您的进程具有SE_TCB_NAME特权,则可以在调用LogonUser时指定用户的身份验证凭据。如果登录操作成功,则该函数返回表示指定用户的主访问令牌。您可以在调用CreateProcessAsUser中使用此主令牌来创建在用户的安全上下文中运行的进程。请注意,在这种情况下,由于您在LogonUser呼叫中提供了密码,新进程将可以访问网络。

SECURITY_IMPERSONATION_LEVEL枚举定义了四个模拟级别。

假冒级别含义
SecurityAnonymous表示客户端不希望服务器获取有关客户端的标识信息。
SecurityIdentification允许服务器获取有关客户端的信息,例如安全标识符和权限,而无法模拟客户端。这对于导出其自己的对象的服务器(例如导出表和视图的数据库产品)非常有用。使用检索到的客户端安全信息,即使服务器无法使用其他服务作为客户端,服务器也可以自己进行访问验证决策。
SecurityImpersonation允许服务器在本地系统上模拟客户端的安全上下文。服务器无法模拟远程系统上的客户端。
SecurityDelegationWindows NT安全性不支持此模拟级别。