web-dev-qa-db-ja.com

SMJobBless()を使用した特権ヘルパーツールの作成

APIはMacOS X Leopardからオープンになっていますが、驚くべきことに、残念ながら、特権ヘルパーツールを作成するためにSMJobBless()を正しく使用する方法に関するドキュメントはほとんどありません。 Appleのサンプルプロジェクトから直接コードをコピーする場合でも、多くの落とし穴があります。幸いなことに、私はこれを回避する方法を見つけ、ヘルパーツールが機能するための基礎を手に入れました。

ただし、SMJobBless()はツールを祝福してコピーするだけで、実行しないように見えます。ヘルパーツールのmain()関数に、should実行するコードを含めましたが、(NSLog()が不可解に機能しないため、実行されません。ほんの少しの情報have found–いくつかの「Helloworld」タイプの文字列をsyslog()しようとしましたが、システムコンソールに何も表示されません)。ヘルパーツールが起動したという兆候はまったくありません。
ドキュメントはほとんど役に立たない。 SMJobBless()が呼び出された後、ヘルパーツールは「準備完了」であり、「準備完了」が何を意味するのかさえ示されていません。

さらに、Appleのサンプルにはプロセス間通信コードが含まれておらず、ヘルパーツールとの対話方法についても説明されていません。分散オブジェクトを使用していますか?マッハポート?知るか?それを行う方法についての公式の言葉はありません。

それで、誰かがこれを成し遂げる方法について何か情報を持っていますか?ヘルパーツールがインストールされ、認証が機能することを確認しましたが、ヘルパーツールを起動して通信する方法がわかりません。ドキュメントにギャップがあるため、これは今のところ謎です。とてもイライラします。私はこの問題を抱えているのみになることはできません(しかし、それについてはほとんど言及されていませんどこでも)、そしてSMJobBless()は明らかに機能しますどういうわけか、Appleが使用するものだから。

AuthorizationExecuteWithPrivileges()については言及しないでください。私は使用していません。非推奨であり、確実に削除され、主要なセキュリティホールです。いいえ。)

26
Itai Ferber

特権を昇格させようとしている場合、XPCはオプションではありません( https://developer.Apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html )::

デフォルトでは、XPCサービスは、最小限のファイルシステムアクセス、ネットワークアクセスなどでサンドボックス化された、可能な限り最も制限された環境で実行されます。サービスの特権をrootに昇格させることはサポートされていません。

SMJobBlessは、Appleが提供するSMJobBlessの例のように、ヘルパーツールをインストールし、Launchedに登録します。ヘルパーツールを実際に起動するための秘訣は、ヘルパーツールのアドバタイズされたサービスに接続しようとすることです。

ssdと呼ばれるWWDC2010の例があり、ソケットを介して単純に起動されたクライアント/サーバーモデルを示しました。 Appleからはもう利用できませんが、ここにリンクがあります: https://lists.Apple.com/archives/macnetworkprog/2011/Jul/msg00005。 html

Ssdの例のサーバーコードのディスパッチキュー処理をSMJobBlessの例のヘルパーツールに組み込み、メインアプリが適切なポートで接続を試行したときにヘルパーツールが実際に(rootとして)実行されていることを確認できます。ヘルパーツール(ソケット以外)と通信できる他のメカニズムを理解するには、LaunchedのWWDC2010ビデオを参照してください。

変更したソースを合法的に再配布できるかどうかはわかりませんが、2つのプロジェクトをマージして、ヘルパーツールを実行するのはかなり簡単です。

編集:これは、アプリとヘルパー間の通信に分散オブジェクトを使用する、私が作成したプロジェクトの例です: https:// www。 dropbox.com/s/5kjl8koyqzvszrl/Elevator.Zip

23
xdissent

実際、@ KurtRevisのコメントは正しいです。XPCサービスを使用せずに、XPC APIを使用できます。それ以来、この仕事に最適です。

Nathan de Vriesは、SMJobBlessでXPC APIを使用する優れた記事を掲載しており、SMJobBlessサンプルアプリを変更して、マッハ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

スレッドをくぐり抜けたくない場合は、EricGorrが提供する変更されたSMJobBlessサンプルプロジェクトへのリンクを次に示します。

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

また、ここで他の回答に記載されているssdの例は、WWDC2010ダウンロードバンドルの一部としてAppleからオンラインで入手できます。

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

11
Mark Aufflick

Apple now(2015)には、特権ヘルパーツールをインストールし、NSXPCConnectionAPIを使用してアプリとヘルパーツールの間で通信する方法を示す「EvenBetterAuthorizationSample」があります。

READMEは、利用可能なSMJobBless()の最高の(唯一の?)ドキュメントの一部です。

6

私はあなたの痛みを感じ、同じ船に乗っています。私は、さまざまなシステム構成タスクを実行する必要があるアプリのMacバージョンを担当しています。もちろん、これらのタスクの一部は管理者権限で実行する必要があります。 BetterAuthorizationSample のサンプルコードを使用することから始めました。実装するのは大きな苦痛でしたが、うまくいったようです。しかし、その後、一部のシステムでクラッシュするケースに遭遇しました。私はBASコードが行うことすべてを理解していなかったし、私自身のコーディング経験の欠如がおそらく問題の原因でした。そのため、これらの特権関数をアプリから削除する必要がありました。

Appleはドキュメントの不足を気にしていないようだ。 ServiceManagementフレームワークの作成者からのこのメッセージ を参照してください。彼のコメントから、XPCは彼が言及している「直感的な代替品」であると思いますが、Lionでのみ利用可能であるため、SnowLeopardまたはそれ以前のクライアント向けの別のソリューションを見つける必要があります。また、XPCを特権ヘルパー(管理者またはルートアクセスを必要とするシステムレベルのタスク)に使用できるのか、それともアプリ内で特権を分離して安全性を高めることだけを目的としているのかはわかりません。

BASドキュメントは更新が切実に必要ですが、それも 最優先事項ではないようです

今、私は自分のアプリをゼロから書き直そうとしています。 Professional Cocoa Application Security by Graham Leeは、SMJobBlessで特権ヘルパーを使用する方法についていくつかの洞察を提供しますが、起動されたジョブへのオンデマンドアクセスについてはあまり詳しく説明しません。

これが私が見つけたものです:

特権ヘルパーをオンデマンドで起動する場合は、IPCソケットを使用する必要があります。ヘルパーの launchd.plist にSocketsエントリを追加する必要があります。 SMJobBlessを使用してアプリをインストールした後、ヘルパーはlaunchdを使用して(LAUNCH_KEY_CHECKINを介して)「チェックイン」し、ソケットファイル記述子を取得する必要があります。

悲しいことに、LAUNCH_KEY_CHECKINについての唯一の言及は、 SampleD および [〜#〜] bas [〜#〜] サンプルコードにあるようです。

私はソケットの経験がないので、それが現時点での私の障害です。可能な限り最高レベルのAPIを使用したいので、これにObjective-Cクラス(NSStreamなど)を使用できるかどうかを調べようとしています。

起動された開発者のメーリングリスト が役立つかもしれません。私が今見つけたもう1つのXPCオプションは XPCKit です。一見の価値があります。

HTH

4
Jonukas

私は数ヶ月前にこれについてブログ投稿を書きました。これには、AppleのSMJobBlessサンプルのクリーンアップバージョンが含まれていました。役立つかもしれません...

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

4
Sam Deane

Itaiは、WWDC 2010のSMJobBlessサンプルコードを見ましたか?それを祝福するためのヘルパーツールとアプリが含まれています。

https://developer.Apple.com/library/mac/#samplecode/SMJobBless/Listings/ReadMe_txt.html#//Apple_ref/doc/uid/DTS40010071-ReadMe_txt-DontLinkElementID_

そのREADMEファイルは言う:

このサンプルは現状では、実際にはヘルパーツールを実行していません。次のサンプルは、起動されたジョブを[原文のまま]、プロセス間通信を設定する方法を示しています。

  • ssd(もうオンラインではないようです。WWDC2010サンプルコードの一部でした。)
  • BetterAuthorizationSample
0
Ken Aspeslagh