2

作業中のOSXアプリケーションがあります。サンドボックス化されていません(サンドボックス化を防ぐことを行う内部アプリケーションです)。

ある時点で、私のアプリケーションは補助アプリケーション、実際には単なるコマンドラインアプリケーションを開始します。このアプリケーションから、TMPDIRへのファイルの書き込み以外のすべてのことができるようにしたいと思います。最小特権の原則に従おうとしています。

私が使用している現在のコードは次のとおりです。

NSTask* task = [NSTask new];
NSBundle* thisBundle = [NSBundle mainBundle];
[task setArguments:@[a, b, c]];
[task setLaunchPath:[thisBundle pathForAuxiliaryExecutable:@"MyProgram"]];
[task launch];

これはNSTaskで可能ですか?そうでない場合、非常に低い特権でMyProgramを起動するためにどのメカニズムを使用できますか?

4

1 に答える 1

2

これに最適なツールはXPCと呼ばれます。10.7では少し弱かったのですが、10.8では信じられないほど強力です。その全体的な目的は、IPCを非常に簡単にしながら、この方法でプログラムをセグメント化できるようにすることです。いくつかのドキュメント:

  • デーモンおよびサービスプログラミングガイド「XPCサービスの作成」
  • NSXPCConnection
  • XPCとのCocoaプロセス間通信(WWDC 2012セッション)
  • XPCの紹介(WWDC 2011セッション)
  • ObjectToXPC-サードパーティライブラリ。私はそれで遊んだことはありませんが、10.7でオブジェクトマーシャリングを行うことを約束します(ただし、オブジェクトマーシャリングが危険な理由を以下で参照してください)。独自のJSONプロトコルなどを使用することもできます。

10.8でのXPCの大きな変更の1つは、を追加したことNSSecureCodingです。彼らは、オブジェクトのマーシャリングをより安全に実行できるように、クラス情報をプロトコル定義に挿入するようにコンパイラーを変更しました。これは、ObjCプロトコルがを渡すと言うときNSString、オブジェクトがであるかどうかを実際にチェックできることを意味しますNSString。(10.8より前は、オブジェクトにクラス情報はありませんでしたProtocol。引数が「オブジェクト」であるかどうかしか確認できませんでした。)

誰も気にしない?ええと、私があなたの低特権タスクを乗っ取って、それをだましてではNSSomethingElseなく返すようにしたとしましょNSStringう(たぶん私はisaそのクラスを変更するためにポインタを上書きするだけです)。そして、それが攻撃者として私に役立つ何かをNSSomethingElseする方法を持っているとしましょう。lengthこれで、特権の高いタスクがを呼び出すと[returnedValue length]、間違ったメソッドが実行されます。あるいは、メソッドNSSomethingElseがないlength可能性があるため、特権の高いタスクに「セレクターを実装しない」例外をスローさせることができます。これは、私にも役立つ可能性があります。を使用NSSecureCodingすると、この種の攻撃ははるかに困難になります。返されたオブジェクトをイントロスペクトし、ではないことに注意してNSString、呼び出し元のコードに返すことを拒否できます。

の優れた点がなくても、10.7以上をNSXPCConnectionターゲットにしている場合は、この種の作業にXPCをお勧めします。

于 2012-09-20T14:20:35.233 に答える