如何 identify/authorize 命名管道中消息的发送者? (创建命名管道)

How to identify/authorize the sender of a message in a named pipe? (CreateNamedPipe)

我已经使用命名管道在两个应用程序之间建立了通信。 第一个应用程序创建一个带 CreateNamedPipe 的命名管道,并读取第二个应用程序发送的带 ReadFile 的消息。两个应用程序都能够按预期方式进行通信。

是否可以通过某种方式识别所收到消息的发件人? 如果没有某种标识(例如获取发件人 exe 路径)或授权,其他所有应用程序都可以使用该管道向我的应用程序发送消息。

(编辑) 更多细节,因为在这种情况下它似乎很重要:
创建管道的应用程序 运行ning 作为 Windows 服务。 两个应用程序 运行 在同一系统本地。

GetNamedPipeClientProcessId() will give you the process ID of the client process. You can then open a handle to the process with OpenProcess() and call GetModuleFileNameEx() to determine what application is running in that process. You can then vet the application in whatever way you think best, e.g., you might want to check the identity of the digital certificate 或者您可能更愿意只检查路径名是否符合您的预期。

请注意,尝试限制对特定应用程序而非特定用户的访问永远不会稳健;攻击者始终可以控制已批准的应用程序,并用自己的代码替换其代码。基本上不会超过一个减速带,但如果你觉得值得做,就可以做。


如果您真正想知道 user 连接了什么,您应该使用 ImpersonateNamedPipeClient() as already suggested in the comments, followed by OpenThreadToken() 等等。或者更好的是,在创建命名管道时设置权限,以便首先只有授权用户才能连接。


既然您已经阐明客户端以提升的权限运行,我可以提出更具体的建议:执行上述两项操作。 配置命名管道的权限,这样只有Administrators组的成员才能访问;这将确保只有 运行 提升权限的应用程序才能访问它。检查可执行文件也不会造成伤害,但仅靠它是不够的,因为攻击者可以启动您的应用程序的副本,抑制请求的提升,并将他们自己的代码注入到进程中。 (或者,正如 conio 指出的那样,修改他们自己的进程,使其看起来好像是 运行 您的可执行文件;GetModuleFileNameEx() 不打算用作安全措施,因此它不会努力避免欺骗.)