【发布时间】:2020-10-25 03:32:41
【问题描述】:
我正在编写一个守护进程,它需要接受来自潜在不受信任的应用程序的由 PID 标识的未命名管道连接。使用 Unix 域套接字,这不是一项复杂的任务:在文件系统上创建一个套接字,开始侦听,接受传入的连接,通过辅助数据接收未命名管道的读取端的文件描述符,make sure that the application sending the file descriptor is what it pretends to be(只有 PID 是需要弄清楚其余部分,这很方便),然后开始使用私有未命名管道连接从应用程序接收数据,同时仍侦听套接字以获取新连接。
然而,在 Windows 上,第三方应用程序可以识别的唯一 IPC 方法(因此可用于通过其他 IPC 方法建立连接而无需父子关系)是命名管道(在 Unix 中已知)术语作为 FIFO 文件)。感谢DuplicateHandle(),无需使用某种辅助数据传输系统从应用程序获取文件描述符,任何进程都可以将其任何句柄发送给任何其他进程,前提是目标进程通过某些知道句柄值IPC 的形式,在我的例子中是命名管道。但是,命名管道不能识别写入者,即如果应用程序在那里写入句柄 x 并假装具有某个 PID a,则无法知道是谁在句柄 @987654326 上的未命名管道上写入@ 实际上是 PID a 而不是 PID b 的进程试图搞乱守护进程中的记录管理。
TL;DR 如何在 Windows 上的守护进程和非子进程之间创建未命名的管道连接,并绝对确定该进程发送的管道句柄确实属于它而不是冒名顶替进程?
【问题讨论】:
-
GetNamedPipeClientProcessId获取打开客户端的进程的PID。客户端的句柄可能被复制或继承到另一个进程,但复制进程需要PROCESS_DUP_HANDLE对客户端的自主访问权。默认情况下,此访问权限仅授予 SYSTEM 和拥有进程的安全主体。对进程的强制访问控制也拒绝低完整性进程的读取访问,因此受到双重保护。
标签: windows pipe ipc unix-socket