2011-04-18 89 views
6

我正在研究需要使用dd的應用程序(我在應用程序包中使用shell腳本執行此操作,從應用程序本身收集參數,進行一些檢查然後啓動dd )。NSTask,命令行工具和根

爲了做這個操作,我需要用root調用dd,並且我已經在StackOverflow中查看了幾個解決方案。最簡單的實現在我看來這是一個http://www.sveinbjorn.org/STPrivilegedTask

問題是,我的NSTask使一些複雜的讀/寫操作(不存在STPrivilegedTask),並不需要全部特權。

所以我寫了一個小型的輔助工具在c中,用我的應用程序中的正確參數調用我的腳本。我認爲解決方案是使用STPrivilegedTask來SUID一旦飛行我的小幫手工具,所以我可以啓動它(以及我的腳本和DD)與根,並在成功啓動後不久,我將輔助工具設置爲非SUID(如果有任何錯誤,應用程序退出,應用程序啓動等等,我也會這樣做,以便更安全)。

我實現了它,工作得很好,也許它不是完美的,但我認爲,所有內部的捆綁,並在SUID中使用輔助工具只是爲了啓動聽起來足夠安全。

有什麼想法?

謝謝!

回答

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")) 

更新: 值得一提的,你可以使用 沙箱EXEC -p命令

+1

嗨Jsmp,我嘗試了沙盒系統,因爲我在過去使用它,但它不是我需要什麼,我只需要以root身份執行任務(也可以用於我需要的其他命令,例如mount和umount等)。任何人對我的helperTool臨時SUID解決方案有一些建議?可能的漏洞和替代品? – opoloko 2011-04-18 10:44:55

+0

除此之外,我還在helperTool中實現了代碼,以便在自己的進程結束時將自己從suiled變爲non suided。所以它從應用程序中獲取SUID,它會使用正確的參數啓動腳本,並在自動完成後自行創建SUID。似乎是一個很好的補充安全步驟.. – opoloko 2011-04-18 13:06:43

+0

嗨opoloko,我看到你只是想保持文件的安全方式。從我的角度來看,仍然存在這樣的情況,即用戶在解除應用程序之前可以使用SUID將應用程序保留下來。 – jsmp 2011-04-20 18:10:19