如何在命名管道中识别/授权邮件的发件人? (CreateNamedPipe时)

时间:2017-02-03 15:08:17

标签: winapi named-pipes

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

是否有可能识别收到的邮件的发件人? 如果没有某种标识(比如获取发送者exe路径)或授权,则每个其他应用程序都可以使用该管道向我的应用程序发送消息。

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

1 个答案:

答案 0 :(得分:1)

GetNamedPipeClientProcessId()将为您提供客户端进程的进程ID。然后,您可以使用OpenProcess()打开流程句柄,并调用GetModuleFileNameEx()以确定该流程中正在运行的应用程序。然后,您可以以您认为最好的方式审核应用程序,例如,您可能想要检查digital certificate的身份,或者您可能更愿意检查路径名是否符合您的预期。

请注意,尝试限制对特定应用程序而非特定用户的访问权限永远不会强大;攻击者可以随时控制已批准的应用程序并将其代码替换为自己的代码。基本上它不会超过减速带,但如果你觉得它值得做,那就可以做到。

如果您真正想知道用户已连接的内容,您应该使用评论中已建议的ImpersonateNamedPipeClient(),然后使用OpenThreadToken()等等。或者更好的是,在创建命名管道时设置权限,以便只有授权用户才能首先连接。

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