NSTask,命令行工具和root

时间:2011-04-18 00:30:56

标签: objective-c shell root nstask suid

我正在开发一个需要使用dd的应用程序(我在应用程序包中使用shell脚本执行此操作,从应用程序本身收集参数,进行一些检查然后启动dd)。

要进行此操作,我需要使用root调用dd,我已经在StackOverflow上查看了几个解决方案。在我看来,最简单的实现http://www.sveinbjorn.org/STPrivilegedTask

问题是我的NSTask进行了一些复杂的读/写操作(不存在于STPrivilegedTask中),并且不需要全部特权。

所以我在c中编写了一个小帮助工具,用我的应用程序中的正确参数调用我的脚本。我认为解决方案是使用STPrivilegedTask来启动我的小助手工具,所以我可以用root启动它(以及我的脚本和dd),并且在成功启动后不久我将帮助工具设置为非SUID(并且如果有任何错误,我会做同样的错误,在应用程序退出,应用程序启动等...更安全)。

我实现了它并且工作得很好,也许它并不完美,但我认为完全在捆绑中,并且在SUID中使用辅助工具只是为了启动声音足够安全。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用沙箱在NSTask中运行新进程

sandbox-exec -f <profile> <command>
sandbox-exec -f my_profile.sb "/bin/dd -if=/dev/disks01 of=/dev/target" 

http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/sandbox-exec.1.html

您在此处有一些个人资料示例

/usr/share/sandbox/

你必须为dd提供足够的访问权限,我还没有尝试或检查dd需要什么,我会从这样的事情开始:

(version 1)
(deny default)
(debug deny)
(import "system.sb")
(allow file-read-data file-write-data file-ioctl                 (regex #"^/dev/.*$"))
(allow process-exec (literal "/usr/sbin/helper"))

更新: 值得一提的是,你可以使用 sandbox-exec -p命令