繁体   English   中英

使用 SMJobBless() 编写特权助手工具

[英]Writing a privileged helper tool with SMJobBless()

尽管 API 从 Mac OS X Leopard 开始就已经开放,但令人惊讶的是,不幸的是,关于如何正确使用SMJobBless()来创建特权帮助工具的文档非常少。 即使直接从 Apple 的示例项目中复制代码,也有很多问题。 幸运的是,我找到了解决这个问题的方法,并为我的辅助工具工作奠定了基础。

但是,似乎SMJobBless()只会祝福该工具并将其复制过来,但不会运行它。 我已经包括在我的帮助工具的代码main()函数应该运行,但不会(因为NSLog()莫名其妙地不工作,根据发现-我试过的信息点点syslog()输入一些“Hello world”类型的字符串,但系统控制台上什么也没有出现)。 没有任何迹象表明辅助工具已启动。
文档大多没用。 它只是说在SMJobBless()之后,辅助工具“准备好了”,甚至没有说明“准备好”是什么意思。

此外,Apple 的示例不包含任何进程间通信代码,也没有解释应该如何与辅助工具交互。 你使用分布式对象吗? 马赫端口? 谁知道? 没有关于如何做到这一点的官方消息。

那么,有没有人有任何关于如何完成这项工作的信息? 我已经确认安装了帮助工具,并且身份验证有效,但我根本无法弄清楚如何启动帮助工具并与之通信 - 文档中只是存在这样一个空白,这对于现在来说是个谜。 这非常令人沮丧; 我不可能是唯一一个SMJobBless()这个问题的人(但在任何地方都很少提到它),而且SMJobBless()显然以某种方式起作用,因为它是 Apple 使用的。

(请不要提及AuthorizationExecuteWithPrivileges() 。我没有使用它:它已被弃用,肯定会消失,并且是一个主要的安全漏洞。不,谢谢。)

如果您尝试提升权限,则 XPC 不是一种选择(来自https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html ):

默认情况下,XPC 服务在尽可能受限的环境中运行 — 沙盒,具有最少的文件系统访问、网络访问等。 不支持将服务的权限提升为 root。

SMJobBless 将安装一个辅助工具并将其注册到 Launchd,如 Apple 提供的 SMJobBless 示例。 让您的助手工具真正启动的诀窍是简单地尝试连接到您的助手工具的广告服务。

有一个名为ssd的 WWDC2010 示例,它通过套接字演示了一个简单的启动客户端/服务器模型。 Apple 不再提供它,但我在这里找到了一个链接: https : //lists.apple.com/archives/macnetworkprog/2011/Jul/msg00005.html

我已将 ssd 示例中服务器代码中的调度队列处理合并到 SMJobBless 示例中的辅助工具中,并且可以确认当我的主应用程序尝试在适当的端口上建立连接时,我的辅助工具确实正在运行(以 root 用户身份)。 请参阅 Launchd 上的 WWDC2010 视频,了解可以与辅助工具(套接字除外)进行通信的其他机制。

我不确定我是否可以合法地重新分发我拥有的修改后的源代码,但是合并这两个项目并运行您的帮助工具应该相当简单。

编辑:这是我编写的一个示例项目,它使用分布式对象在应用程序和助手之间进行通信: https : //www.dropbox.com/s/5kjl8koyqzvszrl/Elevator.zip

事实上@KurtRevis 的评论是正确的,您可以在不使用 XPC 服务的情况下使用 XPC API,并且它非常适合这项工作。

Nathan de Vries 写了一篇关于将 XPC API 与 SMJobBless 结合使用的优秀文章,甚至修改了 SMJobBless 示例应用程序以使用 mach XPC 来激活作业和双向通信:

http://atnan.com/blog/2012/02/29/modern-privileged-helper-tools-using-smjobbless-plus-xpc/

https://github.com/atnan/SMJobBlessXPC

与所有这些有些相关的是避免不必要的管理员密码提示。 有关如何检查已安装帮助程序的包版本和代码签名是否匹配的想法,请参阅以下电子邮件列表线程(这也允许您在用户降级的情况下删除更高版本的帮助程序):

http://www.cocoabuilder.com/archive/cocoa/309298-question-about-smjobbless.html

如果您不想涉足这个线程,这里是 Eric Gorr 提供的修改后的 SMJobBless 示例项目的链接:

http://ericgorr.net/cocoadev/SMJobBless.zip

另请注意,此处其他答案中提到的 ssd 示例仍可从 Apple 在线获得,作为 WWDC 2010 下载包的一部分:

http://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftware?code=y&source=x&bundleID=20645

Apple 现在(2015 年)有一个“EvenBetterAuthorizationSample”,它演示了安装特权帮助工具并使用NSXPCConnection API 在应用程序和帮助工具之间进行通信:

自述文件是SMJobBless()一些最好的(唯一的?)文档。

几个月前我写了一篇关于此的博客文章,其中包括 Apple 的 SMJobBless 示例的清理版本。 可能有帮助...

http://www.bornsleepy.com/bornsleepy/os-x-helper-applications

我感受到你的痛苦,并且在同一条船上。 我负责一个需要执行各种系统配置任务的应用程序的 Mac 版本。 当然,其中一些任务需要使用管理权限来完成。 我首先使用来自BetterAuthorizationSample的示例代码。 实施起来很痛苦,但似乎奏效了。 但是后来遇到了它会在某些系统上崩溃的情况。 我不明白 BAS 代码所做的一切,而且我自己缺乏编码经验可能导致了这些问题。 所以我不得不从我的应用程序中删除这些特权功能。

苹果似乎并不关心缺乏文档。 请参阅来自 ServiceManagement 框架创建者的此消息 根据他的评论,我认为 XPC 是他所指的“直观替代品”,但由于它仅在 Lion 上可用,因此您仍然需要为 Snow Leopard 或更早的客户找到另一种解决方案。 我也不清楚 XPC 是否可用于特权助手(需要管理员或 root 访问权限的系统级任务),还是仅用于您自己的应用程序中的特权分离以使其更安全。

BAS 文档迫切需要更新,但它似乎也不是首要任务

现在我试图从头开始重写我的应用程序。 Graham Lee 的Professional Cocoa Application Security提供了一些关于如何使用 SMJobBless 的特权助手的见解,但没有详细介绍按需访问已启动的作业。

所以这是我能够找到的:

如果您想按需启动特权助手,则必须使用 IPC 套接字。 您应该在您的助手的launchd.plist 中添加一个 Sockets 条目。 使用 SMJobBless 安装应用程序后,助手将需要使用 launchd(通过 LAUNCH_KEY_CHECKIN)“签入”以获取套接字文件描述符。

可悲的是,LAUNCH_KEY_CHECKIN 的唯一提及似乎是在SampleDBAS示例代码中。

我对套接字没有任何经验,所以这是我目前的障碍。 我想尽可能使用最高级别的 API,所以我试图找出是否可以为此使用任何 Objective-C 类(如 NSStream)。

您可能会发现launchd 开发人员邮件列表很有帮助。 我刚刚发现的另一个 XPC 选项是XPCKit 值得一看。

HTH

Itai 你看过 WWDC 2010 的 SMJobBless 示例代码吗? 它包括一个帮助工具和应用程序来祝福它。

https://developer.apple.com/library/mac/#samplecode/SMJobBless/Listings/ReadMe_txt.html#//apple_ref/doc/uid/DTS40010071-ReadMe_txt-DontLinkElementID_3

它的自述文件说:

这个示例实际上并没有运行辅助工具。 以下示例显示了如何 [原文如此] 启动作业并设置进程间通信:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM