C++ 防止使用ImpersonateNamedPipeClient()

C++ 防止使用ImpersonateNamedPipeClient(),c++,windows,security,named-pipes,C++,Windows,Security,Named Pipes,当命名管道客户端连接到服务器并写入一些数据时,服务器可以调用以模拟客户端。(在调用ImpersonateNamedPipeClient()之前,服务器确实需要读取数据) 正如我们在上所看到的,这可能导致权限提升安全漏洞 是否可以阻止/禁用/拒绝此模拟,以便客户端可以连接到命名管道,但不允许服务器模拟 注意1:我知道客户机需要首先在命名管道上进行写入。但是在某些情况下,客户端需要先写,所以我需要防止这个安全漏洞 注意2:欢迎使用适用于Windows XP及以上版本的解决方案。当调用以打开命名管道的

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

正如我们在上所看到的,这可能导致权限提升安全漏洞

是否可以阻止/禁用/拒绝此模拟,以便客户端可以连接到命名管道,但不允许服务器模拟

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

注意2:欢迎使用适用于Windows XP及以上版本的解决方案。

当调用以打开命名管道的客户端时,请在
dwFlagsAndAttributes
参数中传递
SECURITY\u IDENTIFICATION
。这允许服务器识别用户并确定客户端的权限,但防止服务器模拟客户端的安全上下文

如果您还想阻止服务器识别用户,可以使用
SECURITY\u ANONYMOUS

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

有关更多信息,请参阅MSDN上的页面

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

如果您使用的是C#NamedPipeClientStream,请使用接受
System.Security.Principal.TokenImpersonationLevel.Identification
参数的重载。