当命名管道客户端连接到服务器并写入一些数据时,服务器可以调用 ImpersonateNamedPipeClient()
来模拟该客户端。 (服务器确实需要在调用ImpersonateNamedPipeClient()
之前读取数据)。
正如我们在this link上看到的那样,这可能导致特权升级安全漏洞。
是否可以防止/禁用/拒绝这种模拟,以便客户端可以连接到命名管道但不允许服务器模拟?
注1:我知道客户端需要首先在命名管道上编写。但是在某些情况下,客户端需要首先编写,因此我需要防止这种安全漏洞。
注2:赞赏一种适用于Windows XP及更高版本的解决方案。
最佳答案
调用CreateFile()打开命名管道的客户端时,请在SECURITY_IDENTIFICATION
参数中传递dwFlagsAndAttributes
。这使服务器可以识别用户并确定客户端的特权,但可以防止服务器模拟客户端的安全上下文。
如果您还想阻止服务器识别用户,则可以改用SECURITY_ANONYMOUS
。
请注意,服务器仍然可以成功调用ImpersonateNamedPipeClient(),但是任何使用模拟 token 的尝试都将受到指定的模拟级别的限制。例如,如果服务器尝试在标识或匿名级别模拟客户端的同时打开文件,则该操作将失败。
有关更多信息,请参见MSDN上的Impersonation Levels页面。
还应注意,从Windows XP Service Pack 2开始,服务器无法模拟客户端,除非它拥有SeImpersonatePrivilege特权。 (请参阅MSDN上的ImpersonateNamedPipeClient。)在默认配置中,只有系统服务和管理员才具有此特权。这有效地减轻了您链接到的文章中描述的许多(尽管不是全部)风险。