2012-07-06 10 views
7

私は現在、私の学士論文のための非常にモジュール化されたプラグインベースのフレームワークに取り組んでいます。主なアイデアは、アプリケーション構造内にpluginsという名前のフォルダがあり、特別なインターフェイスIPluginに準拠するコンパイル済みプラグイン(たとえば.dll-ファイル)をドロップできるということです。アプリケーションは、ユーザーが選択したプラグインを使用してタスクを実行します。したがって、PDFファイルで1回タスクを実行する場合は、PdfPluginを選択し、単語ドキュメントでは、DocPluginを選択します。プラグインが有害なコードを実行するのを防ぐ方法

出力もインターフェイスで定義されているため、すべてのプラグインは同じデータ構造を返します。実際の作業は各​​ライブラリごとに異なります。

ここで、アプリケーションはインターフェイスに定義されたメソッドを呼び出すだけです。 ParseDocument()など、どのようにして(第三者によって開発された可能性のある)プラグインが有害なコードを実行するのを防ぐことができますか?

私は.NET3.5で作業しています(おそらく4に切り替わり、まだ決定していません)。C#。

答えて

8

私はその場合には.NET3.5

に取り組んでいて、私は、別のAppDomainで実行Code Access Securityを使用して、アプリケーションドメインのアクセス許可セットを制限するために、あなたのプラグインを分離します。これはあなたのプラグインアセンブリを "サンドボックス"します。

たとえば、すべてのアンマネージドコードのアクセス許可とファイルIOのアクセス許可を取り除くと、プラグインはファイルシステムに書き込むことができなくなります。

これは、かすかな心のためではありません。 AppDomainsは扱いにくく、シリアル化、オブジェクトのライフタイムポリシーなどを必要とすることがあります。多くの配管を取り除くので、MAFを使用できます。

+0

プラグインにどのコードアクセスセキュリティのアクセス許可が必要かを問い合わせることはできますか? Androidのインテントのようなものと比較して?私。私はおそらく、私はプラグインがどのようなパーミッションを求めているのかを判断できるプラグインフレームワークが必要なので、プラグインをロードする前に確認を求めるプロンプトが表示されます。それとも、私のアプリでパーミッションを強制して、プラグインが失敗した/許可されたパーミッションの外で何かをしようとすると例外をスローするという点で、逆のことですか? – AaronLS

+0

質問の範囲から外れるような「方法」を求めてはいませんが、これら2つの異なるアプローチのどちらがCASが適切であるか不思議です。 – AaronLS

0

私はこの分野でかなりの研究が行われていることを知っています。 1つの作業アプローチは、ILコードを検査し、禁止されたメソッドシグネチャを探すことです。その後、それらをエラーフックにリダイレクトすると、プラグインvomがさらなるコードを実行するのを停止します。

スマートフォンのセキュリティを強化し、ダウンロードされたアプリから、GPSモジュール、カメラ、マイクなどのアクセス方法をILコードから調べることができます。セキュリティアプリケーションは、これらのアクセス方法にパッチを適用して、アプリケーションが本当にマイクを有効にすることができます。

.NETでは、Mono.CecilのようなILリーダーを使用して、有害なシグネチャのILコードを検査できます。しかし、コードを動的に生成したり、コードをリソースとして保存したり、リソースからrumtimeにコードをロードしたりすることができるので、これを回避する方法は常にあります。概念の証明のために、このアプローチは非常に簡単です。

FXCopルールを作成し、これを使用してプラグインに静的に禁止されたメソッド呼び出しをチェックすることもできます。

+2

"1つの作業アプローチは、ILコードを検査し、禁止されたメソッドシグネチャを探すことです。 DLR、リフレクションなどの動的ディスパッチによるメソッド呼び出しはどうですか? – vcsjones

+0

私はこれを言ったわけではありません。私がしたことは、研究者がそれを行い、かなりの報道反響を得たということでした(スマートフォンのセキュリティはクールです)。私は彼らがStackoverflowの平均的な訪問者ほどハードなコア開発者としてではなかったと思う。おそらく彼らは彼らの考えが良い考えであるかどうかを尋ねたはずです。 –

-2

できません。

DLLは、呼び出し元プログラムの権限で実行されるバイナリコードです。 DLLからのメソッドが呼び出されると、それが何をするかを制御することができません。

プラグインでできることを制限する場合は、実行をメインプログラムに移動する必要があります。これを行う良い方法は、バイナリライブラリの代わりにプログラムによって解析され実行されるスクリプト言語でプラグインを実装することです。

+0

* DLLは.Netではなく、バイナリコード*です – DaveShaw

+1

"できません"はい、できます。それはまさにCASが行うように設計されたものです。 .NET Frameworkは仮想マシンなので、実行時にこれらのルールを適用できます。 – vcsjones

関連する問題