簡體   English   中英

使用 SMJobBless() 編寫特權助手工具

[英]Writing a privileged helper tool with SMJobBless()

盡管 API 從 Mac OS X Leopard 開始就已經開放,但令人驚訝的是,不幸的是,關於如何正確使用SMJobBless()來創建特權幫助工具的文檔非常少。 即使直接從 Apple 的示例項目中復制代碼,也有很多問題。 幸運的是,我找到了解決這個問題的方法,並為我的輔助工具工作奠定了基礎。

但是,似乎SMJobBless()只會祝福該工具並將其復制過來,但不會運行它。 我已經包括在我的幫助工具的代碼main()函數應該運行,但不會(因為NSLog()莫名其妙地不工作,根據發現-我試過的信息點點syslog()輸入一些“Hello world”類型的字符串,但系統控制台上什么也沒有出現)。 沒有任何跡象表明輔助工具已啟動。
文檔大多沒用。 它只是說在SMJobBless()之后,輔助工具“准備好了”,甚至沒有說明“准備好”是什么意思。

此外,Apple 的示例不包含任何進程間通信代碼,也沒有解釋應該如何與輔助工具交互。 你使用分布式對象嗎? 馬赫端口? 誰知道? 沒有關於如何做到這一點的官方消息。

那么,有沒有人有任何關於如何完成這項工作的信息? 我已經確認安裝了幫助工具,並且身份驗證有效,但我根本無法弄清楚如何啟動幫助工具並與之通信 - 文檔中只是存在這樣一個空白,這對於現在來說是個謎。 這非常令人沮喪; 我不可能是唯一一個SMJobBless()這個問題的人(但在任何地方都很少提到它),而且SMJobBless()顯然以某種方式起作用,因為它是 Apple 使用的。

(請不要提及AuthorizationExecuteWithPrivileges() 。我沒有使用它:它已被棄用,肯定會消失,並且是一個主要的安全漏洞。不,謝謝。)

如果您嘗試提升權限,則 XPC 不是一種選擇(來自https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html ):

默認情況下,XPC 服務在盡可能受限的環境中運行 — 沙盒,具有最少的文件系統訪問、網絡訪問等。 不支持將服務的權限提升為 root。

SMJobBless 將安裝一個輔助工具並將其注冊到 Launchd,如 Apple 提供的 SMJobBless 示例。 讓您的助手工具真正啟動的訣竅是簡單地嘗試連接到您的助手工具的廣告服務。

有一個名為ssd的 WWDC2010 示例,它通過套接字演示了一個簡單的啟動客戶端/服務器模型。 Apple 不再提供它,但我在這里找到了一個鏈接: https : //lists.apple.com/archives/macnetworkprog/2011/Jul/msg00005.html

我已將 ssd 示例中服務器代碼中的調度隊列處理合並到 SMJobBless 示例中的輔助工具中,並且可以確認當我的主應用程序嘗試在適當的端口上建立連接時,我的輔助工具確實正在運行(以 root 用戶身份)。 請參閱 Launchd 上的 WWDC2010 視頻,了解可以與輔助工具(套接字除外)進行通信的其他機制。

我不確定我是否可以合法地重新分發我擁有的修改后的源代碼,但是合並這兩個項目並運行您的幫助工具應該相當簡單。

編輯:這是我編寫的一個示例項目,它使用分布式對象在應用程序和助手之間進行通信: https : //www.dropbox.com/s/5kjl8koyqzvszrl/Elevator.zip

事實上@KurtRevis 的評論是正確的,您可以在不使用 XPC 服務的情況下使用 XPC API,並且它非常適合這項工作。

Nathan de Vries 寫了一篇關於將 XPC API 與 SMJobBless 結合使用的優秀文章,甚至修改了 SMJobBless 示例應用程序以使用 mach XPC 來激活作業和雙向通信:

http://atnan.com/blog/2012/02/29/modern-privileged-helper-tools-using-smjobbless-plus-xpc/

https://github.com/atnan/SMJobBlessXPC

與所有這些有些相關的是避免不必要的管理員密碼提示。 有關如何檢查已安裝幫助程序的包版本和代碼簽名是否匹配的想法,請參閱以下電子郵件列表線程(這也允許您在用戶降級的情況下刪除更高版本的幫助程序):

http://www.cocoabuilder.com/archive/cocoa/309298-question-about-smjobbless.html

如果您不想涉足這個線程,這里是 Eric Gorr 提供的修改后的 SMJobBless 示例項目的鏈接:

http://ericgorr.net/cocoadev/SMJobBless.zip

另請注意,此處其他答案中提到的 ssd 示例仍可從 Apple 在線獲得,作為 WWDC 2010 下載包的一部分:

http://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftware?code=y&source=x&bundleID=20645

Apple 現在(2015 年)有一個“EvenBetterAuthorizationSample”,它演示了安裝特權幫助工具並使用NSXPCConnection API 在應用程序和幫助工具之間進行通信:

自述文件是SMJobBless()一些最好的(唯一的?)文檔。

幾個月前我寫了一篇關於此的博客文章,其中包括 Apple 的 SMJobBless 示例的清理版本。 可能有幫助...

http://www.bornsleepy.com/bornsleepy/os-x-helper-applications

我感受到你的痛苦,並且在同一條船上。 我負責一個需要執行各種系統配置任務的應用程序的 Mac 版本。 當然,其中一些任務需要使用管理權限來完成。 我首先使用來自BetterAuthorizationSample的示例代碼。 實施起來很痛苦,但似乎奏效了。 但是后來遇到了它會在某些系統上崩潰的情況。 我不明白 BAS 代碼所做的一切,而且我自己缺乏編碼經驗可能導致了這些問題。 所以我不得不從我的應用程序中刪除這些特權功能。

蘋果似乎並不關心缺乏文檔。 請參閱來自 ServiceManagement 框架創建者的此消息 根據他的評論,我認為 XPC 是他所指的“直觀替代品”,但由於它僅在 Lion 上可用,因此您仍然需要為 Snow Leopard 或更早的客戶找到另一種解決方案。 我也不清楚 XPC 是否可用於特權助手(需要管理員或 root 訪問權限的系統級任務),還是僅用於您自己的應用程序中的特權分離以使其更安全。

BAS 文檔迫切需要更新,但它似乎也不是首要任務

現在我試圖從頭開始重寫我的應用程序。 Graham Lee 的Professional Cocoa Application Security提供了一些關於如何使用 SMJobBless 的特權助手的見解,但沒有詳細介紹按需訪問已啟動的作業。

所以這是我能夠找到的:

如果您想按需啟動特權助手,則必須使用 IPC 套接字。 您應該在您的助手的launchd.plist 中添加一個 Sockets 條目。 使用 SMJobBless 安裝應用程序后,助手將需要使用 launchd(通過 LAUNCH_KEY_CHECKIN)“簽入”以獲取套接字文件描述符。

可悲的是,LAUNCH_KEY_CHECKIN 的唯一提及似乎是在SampleDBAS示例代碼中。

我對套接字沒有任何經驗,所以這是我目前的障礙。 我想盡可能使用最高級別的 API,所以我試圖找出是否可以為此使用任何 Objective-C 類(如 NSStream)。

您可能會發現launchd 開發人員郵件列表很有幫助。 我剛剛發現的另一個 XPC 選項是XPCKit 值得一看。

HTH

Itai 你看過 WWDC 2010 的 SMJobBless 示例代碼嗎? 它包括一個幫助工具和應用程序來祝福它。

https://developer.apple.com/library/mac/#samplecode/SMJobBless/Listings/ReadMe_txt.html#//apple_ref/doc/uid/DTS40010071-ReadMe_txt-DontLinkElementID_3

它的自述文件說:

這個示例實際上並沒有運行輔助工具。 以下示例顯示了如何 [原文如此] 啟動作業並設置進程間通信:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM