Windows 上是不是有 Unix 域套接字模拟?

Posted

技术标签:

【中文标题】Windows 上是不是有 Unix 域套接字模拟?【英文标题】:Is there a Unix domain socket analog on Windows?Windows 上是否有 Unix 域套接字模拟? 【发布时间】: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 和拥有进程的安全主体。对进程的强制访问控制也拒绝低完整性进程的读取访问,因此受到双重保护。 【参考方案1】:

我决定以完全不同的方式解决这个问题,因为即使我知道另一个进程的 PID(这将允许我通过查找进程的 .exe 文件并读取其标题来确认另一个进程的身份/matching 与其文件路径),我不相信程序没有试图破坏守护进程,因为它可以发送任意句柄值而不是创建管道并将真正的读取句柄发送给守护进程。最好的情况——守护进程优雅地拒绝连接,最坏的情况——它崩溃或用来自不相关文件的垃圾填满整个硬盘驱动器。对于系统范围的守护进程来说,这绝对是一个严重的问题。

为了解决这个问题,我换了两边。客户端发送一个初始化请求包(类似于“你好,请在守护进程中注册我”),守护进程使用GetNamedPipeClientProcessId,正如this comment 所建议的那样,获取PID 并识别应用程序,创建一个未命名的管道并使用DuplicateHandle 将句柄发送给客户端,感谢GetCurrentProcess 伪句柄拥有完整权限,然后将写入句柄发送给应用程序。这样,发送有效句柄的责任在守护进程上,而信任它的选择是客户端应用程序,特别是因为它是开源的,允许想要使用守护进程的应用程序开发人员确保它是安全的从中接收句柄。

【讨论】:

以上是关于Windows 上是不是有 Unix 域套接字模拟?的主要内容,如果未能解决你的问题,请参考以下文章

UNIX域套接字

D-Bus 可以在不是 Unix 域套接字的流上使用吗?

UNIX域协议(命名套接字)

UNIX域套接字

couchbase 服务器是不是支持 Unix 域套接字?

将 Unix 套接字移植到 Windows [关闭]