防止使用 ImpersonateNamedPipeClient()

Prevent the use of ImpersonateNamedPipeClient()

当命名管道客户端连接到服务器并写入一些数据时,服务器可以调用 ImpersonateNamedPipeClient() 来模拟客户端。 (服务器确实需要在调用 ImpersonateNamedPipeClient() 之前读取数据)。

正如我们在 this link 中看到的那样,这可能会导致权限提升安全漏洞。

是否可以 prevent/disable/deny 这种模拟,以便客户端可以连接到命名管道但不允许服务器模拟?

注1:我知道客户端需要先在命名管道上写。但是在某些情况下,客户端会需要先写,所以我需要防止这个安全漏洞。

注2:欢迎提供适用于Windows XP及以上的解决方案。

调用CreateFile()打开命名管道客户端时,在dwFlagsAndAttributes参数中传入SECURITY_IDENTIFICATION。这允许服务器识别用户并确定客户端的权限,但防止服务器模拟客户端的安全上下文。

如果您还想阻止服务器识别用户,您可以使用 SECURITY_ANONYMOUS

请注意,服务器仍然可以成功调用 ImpersonateNamedPipeClient(),但任何使用模拟令牌的尝试都将受到指定模拟级别的限制。例如,如果服务器试图在身份或匿名级别模拟客户端时打开文件,操作将失败。

有关详细信息,请参阅 MSDN 上的 Impersonation Levels 页面。

还应注意,从 Windows XP 服务包 2 开始,服务器无法模拟客户端,除非它拥有 SeImpersonatePrivilege 权限。 (请参阅 MSDN 上的 ImpersonateNamedPipeClient。)在默认配置中,只有系统服务和管理员具有此权限。这有效地减轻了您 link 文章中描述的许多(尽管不是全部)风险。