防止使用ImpersonateNamedPipeClient()

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

正如我们在这个链接中看到的那样,这可能会导致特权升级安全漏洞。

可以防止/禁止/拒绝这种模拟,以便客户端可以连接到命名pipe道,但不允许服务器冒充?

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

注2:适用于Windows XP及以上版本的解决scheme是值得赞赏的。

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

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

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

有关更多信息,请参阅MSDN上的模拟级别页面。

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