私はあなたと同じ問題を抱えていました.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 接続を開始できます。