launchd:Mach服务查找失败

问题描述:

通过launchd获得root权限的助手工具无法建立到我的主程序的NSConnection。launchd:Mach服务查找失败

当我用sudo手动启动HelperTool时,连接就起作用,这证明我的服务配置良好,并且问题来自launchd。

日志是:

12.01.12 12:41:07 Debou[8247] [CaptureQueue startCaptureQueueThread] Launched NSConnection service Debou-CaptureQueueThread - (** NSConnection 0x100522090 receivePort <NSMachPort: 0x1005511d0> sendPort <NSMachPort: 0x1005511d0> refCount 1 **) 
12.01.12 12:41:10 com.apple.launchd[1] System: Looking up service Debou-CaptureQueueThread 
12.01.12 12:41:10 com.apple.launchd[1] (com.Debou.PacketTool[8260]) Mach service lookup failed: Debou-CaptureQueueThread 

为什么launchd会不会是能够看到我贩卖NSConnection连接?

AIUI这是由于Mach命名空间的层次结构。您的主程序将在用户会话名称空间中注册其NSConnection,而LaunchDaemon在全局上下文中运行,因此无法看到任何会话名称空间。请注意,当您使用sudo运行助手时,即使它以root身份运行,仍会在会话上下文中运行。请参阅tn2083,尤其是“执行上下文”和“守护进程IPC建议”部分。

您可能可以从LaunchDaemon获取连接并从主程序进行连接(因为会话名称空间从全局名称空间继承),但可能会更好地切换到不同的机制。正如Quinn“爱斯基摩人!”在this message中指出,在安全域之间使用分布式对象(如用户程序和以root身份运行的守护进程)使得很难进行适当的输入验证,因此很可能导致安全漏洞。