6

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

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

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

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

我实现了它并且工作得很好,也许它并不完美,但我认为这一切都在包中,并且在 SUID 中使用帮助工具只是为了启动听起来足够安全。

有什么想法吗?

谢谢!

4

1 回答 1

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 命令

于 2011-04-18T09:43:51.307 回答