NSTask, инструменты командной строки и root - PullRequest
6 голосов
/ 18 апреля 2011

Я работаю над приложением, которое должно использовать dd (я делаю это с помощью сценария оболочки в комплекте приложений, который собирает параметры из самого приложения, делает некоторые проверки и затем запускает dd).

Чтобы выполнить эту операцию, мне нужно вызвать dd с правами root, и я уже рассмотрел несколько решений StackOverflow. Мне показалось, что это самое простое орудие http://www.sveinbjorn.org/STPrivilegedTask

Проблема в том, что мой NSTask выполняет некоторые сложные операции чтения / записи (отсутствуют в STPrivilegedTask) и ему не нужно быть привилегированным.

Итак, я написал небольшой вспомогательный инструмент на языке c, который вызывает мой скрипт с правильными параметрами из моего приложения. Решение, которое я подумал, состоит в том, чтобы использовать STPrivilegedTask для SUID сразу после запуска моего маленького вспомогательного инструмента, чтобы я мог запустить его (и мой сценарий и dd) с помощью root, и вскоре после успешного запуска я установил вспомогательный инструмент на не SUID ( и я делаю то же самое, если возникает какая-либо ошибка, при выходе из приложения, запуске приложения и т. д., чтобы быть более безопасным).

Я реализовал это и работает довольно хорошо, может быть, он не идеален, но я думаю, что все в пакете и работа с вспомогательным инструментом в SUID только для запуска звучит достаточно безопасно.

Есть мысли?

Спасибо!

1 Ответ

1 голос
/ 18 апреля 2011

Вы можете использовать песочницу для запуска нового процесса в вашем 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 команда

...