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

时间:2012-02-03 20:09:20

标签: objective-c cocoa authentication osx-lion ipc

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

但是,SMJobBless()似乎只会祝福该工具并将其复制,但不会运行它。我已经将代码包含在我的帮助工具的main()函数中,应该运行,但不会(因为NSLog()莫名其妙地不起作用 - 根据一点点信息我发现了 - 我已尝试syslog()某些“Hello world”类型的字符串,但系统控制台上没有任何内容。没有迹象表明辅助工具完全启动。
文档大多没用。它只是说在调用SMJobBless()之后,辅助工具“准备就绪”,没有任何“准备好”的指示。

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

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

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

6 个答案:

答案 0 :(得分:22)

如果您尝试提升权限(来自https://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html),则无法选择XPC:

  

默认情况下,XPC服务在最受限制的环境中运行   可能的沙箱,最小的文件系统访问,网络访问和   等等。不支持将服务的权限提升为root。

SMJobBless将安装一个帮助工具并将其注册到Launchd,就像Apple提供的SMJobBless示例一样。让辅助工具实际启动的诀窍就是简单地尝试连接到帮助工具的广告服务。

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

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

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

编辑:以下是我编写的一个示例项目,该项目使用分布式对象在应用和帮助器之间进行通信:http://dl.dropbox.com/u/463624/Elevator.zip

答案 1 :(得分:11)

事实上,@ 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

答案 2 :(得分:6)

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

自述文件是SMJobBless()可用的最佳(仅?)文档。

答案 3 :(得分:4)

我感到你的痛苦,我在同一条船上。我负责需要执行各种系统配置任务的Mac版应用程序。当然,其中一些任务需要通过行政权利来完成。我开始使用BetterAuthorizationSample中的示例代码。实施这是一个很大的痛苦,但似乎有效。但后来碰到了某些系统崩溃的情况。我不明白BAS代码所做的一切,而我自己缺乏编码经验可能会导致问题。所以我不得不从我的应用程序中删除这些特权函数。

Apple似乎并不关心缺少文档。见this message from the creator of the ServiceManagement framework。根据他的评论,我认为XPC是他所指的“直观替代品”,但由于它只适用于Lion,你仍然需要为Snow Leopard或早期客户找到另一种解决方案。我还不清楚XPC是否可以用于特权帮助程序(需要管理员或root访问权限的系统级任务),或者仅用于在您自己的应用程序中进行权限分离以使其更安全。

BAS文档迫切需要更新,但它也doesn't appear to be a top priority

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

所以这就是我能找到的:

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

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

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

您可能会发现launchd developers mailing list很有帮助。我刚发现的另一个XPC选项是XPCKit。值得一看。

HTH

答案 4 :(得分:4)

几个月前我写了一篇博文,其中包括Apple的SMJobBless样本的清理版本。可能有帮助...

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

答案 5 :(得分:0)

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

其README文件说:

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