2011-05-28 31 views
2

我想知道命令行應用程序是否可以請求root訪問權限,如嘗試使用sudo調用本身。如果控制檯應用程序需要root權限,它如何在OS X下sudo自己?

我正在尋找一種解決方案,如果需要的話,可以編寫需要sudo權限的應用程序。

它不需要始終請求root訪問權限,只有在需要時才需要。

+1

這似乎相關http://stackoverflow.com/questions/4556186/access-private-etc-with-c您的問題。 – ditkin 2011-05-28 12:34:01

回答

5

選項:

  • 它可以setuid(0),但只有當它已經被被root用戶,因此具有爲0的真實用戶ID和別人的有效UID。
  • 它可以嘗試execsudosu命令,並擁有自己的UID 0下運行,但只有當sudo被配置爲允許(這通常需要用戶提交的身份驗證,因爲會有一個授權檢查)。
  • 它可以嘗試通過AuthorizationExecWithPrivileges()啓動自己的新副本,但是這又要求用戶提交給authn。
  • 它可能已經安裝了launchd作業,它可以在系統launchd上下文中進行通信。與該作業通信會導致launchd調用它,並且可能會將其配置爲在root用戶下運行。現在要完成這個任務,需要通過安裝程序(在這種情況下用戶通過身份驗證)或通過服務管理框架的API(再次,用戶需要身份驗證來批准該任務)來部署該任務。
  • 它可以利用別人寫得不好的launchd作業來讓該作業以UID 0執行自己。如上所述,這涉及到寫作得很差的launchd作業。

所以基本上可以通過一些選項來實現,但所有可靠的方法都需要用戶進行身份驗證,並且該工具已經以可以在根環境中運行的方式進行部署。我實際上寫了一本關於這個東西的整本書......特別參見Professional Cocoa Application Security的第6章。

請注意,所有的除setuid選項(我不建議你使用)實際上涉及到fork()創建一個單獨的過程中,無論是通過調用進程或launchd。這意味着您實際上可以擁有兩個單獨的可執行文件:一個用戶與之交互,另一個執行特權任務。這比將所有功能放在一個應用程序中更好,所以我建議採用這種方法。

0

是的。例如:

#!/bin/sh 
su root 
# Do things as root here, if authorized 
相關問題