2

launchdを介してroot権限に恵まれたヘルパーツールは、メインプログラムへのNSConnectionの確立に失敗します。

sudoを使用してHelperToolを手動で起動すると、接続が機能します。これは、サービスが適切に販売されていること、および問題が起動に起因することを証明しています。

ログは次のとおりです。

12.01.12 12:41:07    Debou[8247]    [CaptureQueue startCaptureQueueThread] Launched NSConnection service Debou-CaptureQueueThread - (** NSConnection 0x100522090 receivePort <NSMachPort: 0x1005511d0> sendPort <NSMachPort: 0x1005511d0> refCount 1 **)
12.01.12 12:41:10    com.apple.launchd[1]    System: Looking up service Debou-CaptureQueueThread
12.01.12 12:41:10    com.apple.launchd[1]    (com.Debou.PacketTool[8260]) Mach service lookup failed: Debou-CaptureQueueThread 

なぜlaunchdは私の販売されたNSConnectionを見ることができないのですか?

4

1 に答える 1

3

AIUI これは、Mach 名前空間の階層によるものです。メイン プログラムはその NSConnection をユーザー セッション名前空間に登録しますが、LaunchDaemon はグローバル コンテキストで実行されるため、どのセッション名前空間も参照できません。ヘルパーを sudo で実行すると、root として実行されていても、セッション コンテキストで実行されることに注意してください。tn2083、特に「実行コンテキスト」および「デーモン IPC の推奨事項」セクションを参照してください。

LaunchDaemon から接続を提供し、メイン プログラムから接続することもできますが (セッション名前空間はグローバル名前空間から継承されるため)、別のメカニズムに完全に切り替える方がよいでしょう。クインとして「エスキモー!」このメッセージで指摘されているように、セキュリティ ドメイン間で分散オブジェクト (ユーザー プログラムとルートとして実行されているデーモンなど) を使用すると、適切な入力検証を行うことが非常に難しくなり、セキュリティ バグにつながる可能性があります。

于 2012-01-12T17:39:50.907 に答える