6

私は dd を使用する必要があるアプリに取り組んでいます (アプリ自体からパラメーターを収集し、いくつかのチェックを行ってから dd を起動する、アプリ バンドル内のシェル スクリプトを使用してこれを行います)。

この操作を行うには、ルートで 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 に答える