4

システムにルートを追加するには root 権限が必要な OpenVPN など、昇格された権限でプロセスを実行しようとしています。

周りの既存の例を探し回るとAuthorizationExecuteWithPrivileges、現在は非推奨になっているように思われる にたどり着きます。

新しい方法を試しましたSMJobBlessが、この目的での実行可能性についていくつか質問があります。私が理解しているように、別の特権ツールを作成し、ソケットを介して通信して、ツールに特権コマンドを実行するように依頼できます。ただし、メインアプリケーションがプロセス自体を開始しないため、OpenVPNプロセスを開始してリアルタイムで標準出力をキャプチャする方法を理解できないようです。

OpenVPN別のオプションは、実行可能ファイルで setuid を使用することです。によってインストールされたヘルパーを使用してSMJobBless、ファイルのアクセス許可と実行可能ファイルの setuid を設定し、それを通常どおりに実行できますNSTaskか?

編集:

最後に、永続的に何かをインストールすることなく、特権を使用して単一のコマンドを実行する方法はありますか? この新しい方法はより安全ですが、非常に手間がかかるようです。

4

2 に答える 2

1

SMJobBlessヘルパーを使用して XPC と通信することで、なんとか方法を実行できました (Nathan de Vries のブログに示されている方法)。このヘルパーを使用して、外部プロセスのパーミッションを 04555 (setuid, rx) に設定しました。その後、SMJob は不要になったため削除されます。基本的に、「1 回限りの」特権ジョブをエミュレートします。

その後、NSTask を使用してプロセスを開始し、メイン アプリケーションでその出力をキャプチャすることができました。

さらに、SMJob ヘルパーが再祝福され、権限が設定されていない場合は、実行可能ファイルに権限が正しく設定されているかどうかを最初に確認します。

誰かがよりクリーンなソリューションを持っている場合は、自由に共有してください。ありがとう!

于 2012-07-19T00:26:43.043 に答える
0

私はあなたと同じ問題を抱えていました.MacOs X用のOpenVPNマネージャーアプリに必要でした.setuid rootを設定して全員にopenvpnバイナリを開くため、ソリューションは最適とは言えません. これはセキュリティ ホールであり、回避する必要があります。smjobbless ヘルパーを使用している場合はまったく不要です。このヘルパーは root として実行され、必要なことはすべて管理者権限で実行できるため、openvpn バイナリに setuid root を設定しなくても、このヘルパーを介して openvpn を起動できます。

メイン アプリとヘルパーは開発者証明書で署名されているため、メイン アプリであるアプリのみがこのヘルパーと通信できるように、Apple はこのプロセスを設計しました。悪意のあるアプリは、このヘルパーを使用できません。

Nathans のコードを見ると、このヘルパーにメッセージを送信し、このヘルパーから回答を得るためにコードを管理していたことがわかります。彼の例では、「Hey there Helper App」のような sth があり、答えは「Hey there Host App」です。

したがって、これから sth を有効にするには、ヘルパー アプリにコマンドを送信し、ヘルパー側でこれらのコマンドを抽出し、ヘルパー アプリが昇格された権限で実行されるため、昇格された権限で起動するだけです。

Nathans コードを見てください。sty のようなものがあります (smjobblessappcontroller.m 内):

xpc_object_t message = xpc_dictionary_create(NULL, NULL, 0);
    const char* request = "openvpn --config OpenvpnConnection.ovpn";
    xpc_dictionary_set_string(message, "request", request);

    [self appendLog:[NSString stringWithFormat:@"Sending request: %s", request]];

    xpc_connection_send_message_with_reply(connection, message, dispatch_get_main_queue(), ^(xpc_object_t event) {
        const char* response = xpc_dictionary_get_string(event, "reply");
        [self appendLog:[NSString stringWithFormat:@"Received response: %s.", response]];
    });

これにより、openvpn コマンドをヘルパー アプリに送信します。昇格された特権でプロセスを起動するには、ヘルパー側でこのコマンドを抽出するだけです。

smjobblesshelper.c を見て、次のように実行します (__XPC_Peer_Event_Handler の else ブランチで):

const char *response = xpc_dictionary_get_string(event, "request");

文字列応答に openvpn コマンドがあるので、簡単に起動します。

system(response);

それだけです。これは昇格された特権に当てはまります。アプリでこれをおそらくメイン アプリの IBAction プッシュ ボタンで使用して、ユーザーがこのボタンをクリックするたびに必要に応じて openvpn 接続を開始できます。

于 2014-07-25T14:25:24.163 に答える