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

Ita*_*ber 25 authentication cocoa ipc objective-c osx-lion

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

但是,它似乎SMJobBless()只是祝福工具并将其复制,但不会运行它.我已经包括在我的帮助工具的代码main()功能应该运行,但不会(因为NSLog()莫名其妙地不工作,根据我的信息点点已经发现-我试图syslog()荷兰国际集团的一些"世界,你好"类型的字符串,但系统控制台上没有任何内容.没有任何迹象表明辅助工具完全启动.
文档大多没用.它简单地说,在SMJobBless()调用之后,辅助工具是"准备好的",没有任何"准备好"的指示.

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

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

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

xdi*_*ent 23

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

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

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

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

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

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

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

  • 只是注意:"XPC不是一个选项"是不正确的.您当然可以使用XPC与您的特权工具进行通信,就像使用Mach端口或UNIX域套接字一样 - 只需正确设置工具的launchd.plist即可.*是*true是你的帮助工具不是"XPC服务",这是XPC文档主要关注的内容. (8认同)
  • 实际上,我刚刚发现,如果你真的不需要IPC,只想使用`SMJobBless`来模仿`AuthorizationExecuteWithPrivileges`,你可以将以下键添加到助手工具的launchd.plist中:`RunAtLoad`:YES,` LaunchOnlyOnce`:YES,`OnDemand`:NO.然后你的助手工具将在祝福后立即运行.这完全可以使用Apple的SMJobBless示例代码. (6认同)

Mar*_*ick 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


Kri*_*son 6

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

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