我的应用程序包含一个核心扩展作为关键组件。该内核扩展由系统控制套接字控制。出于安全原因,该系统控制套接字仅接受来自超级用户的连接。
为了从我的常规非超级用户应用程序进行通信,我有一个 SMJobBless 助手充当中介。问题是,我只希望我的应用程序(由我签名)能够连接到这个 XPC 服务。有什么方法可以验证连接另一端的可执行文件上的签名吗?如果我可以在另一端获得进程的 PID,那就足够了,我知道如何从那里验证签名。
如果我能得到另一端进程的PID
您可以使用xpc_connection_get_pid()。
对于任何在 2021 年阅读本文的人来说,安全研究表明 PID因其可重用性而不值得信赖。这是关于这个问题的一个很好的介绍。
从 macOS 11 开始,SecCodeCreateWithXPCMessage
可以使用该功能来确定 XPC 消息的真正发送者。在旧版本的 macOS 上,void xpc_connection_get_audit_token(xpc_connection_t, audit_token_t *)
存在未记录的功能,可以使用更多步骤来完成相同的事情。
我构建了一个名为SecureXPC的 Swift XPC 框架,它使用了这两个函数,因此,如果您想了解如何使用它们,请查看该acceptMessage
函数。