2016-11-09 8 views
3

私は、.net DLLを環境にロードする必要があるプラグインシステムを作成しています。彼らは、ポインタの使用法や "安全でない"キーワードの他の使用法が含まれているかどうかを知る必要があります。私は良いリフレクションブラウザを実行しているので、アセンブリ内のすべての型、すべてのメソッド、すべての外部参照、さらにはDLL内のすべてのCIL命令を参照できます。私の知る限りでは、unsafeキーワードは、DLLをコンパイルできるかどうかを判断するために使用された後は保持されません。ロード中の.NETアセンブリに安全でないコードが含まれていることを検出するにはどうすればよいですか?

安全でないタグが残っているメタデータの場所はありますか?安全でない特定のCIL命令がありますか?ランダムなDLLに安全でないコードがあることを確認する別の方法はありますか?

もちろん安全でないコードだけがセキュリティ上の懸念事項ではありませんが、私は今対処しようとしています。

+1

unsafeはC#機能ではなく、.net one –

+0

ああ、残念です。 C#で使用されているプログラミング機能を検出する方法があるかどうか知っていますか? –

+0

私が知っていることではありません。あなたの最後の試合は何ですか? –

答えて

1

私はこのヒューリスティックを使用して安全でないコードを検出します:オブジェクトがアドレスを取るために固定されている固定ブロックを調べます。

これを行うには、アセンブリ内のメソッドを反映し、LocalVariableInfosを取得します。 IsPinnedプロパティのいずれかがtrueの場合、メソッドは安全ではありません。

これを行うことで見落とされる危険な操作は、ピン割り当てを必要としないため、stackallocだけです。スタックにスペースを割り当てるために使用されるLocallocオペコードが存在するかどうかをメソッド本体でチェックすることで、それを把握できます。

これらのチェックと、安全でない唯一の方法は、ローカル変数へのポインタを介してスタック上の値の型を操作するものです。残念なことに、ローカル変数のアドレスを取ることは、通常の多くのタスクで使用される通常のコンパイラ操作であり、それをフィルタリングすることはできません。

C#以外のコンパイラは、安全な方法の通常のコンパイルの一部としてこれらを自由に使用できますが、C#の場合、このヒューリスティックは完全に機能するはずです。

+1

素晴らしいです、ありがとう!私は今これらの両方のケースを検出しています。 このメソッドが失敗するケースがあります... public unsafe int UnsafeMethod2(int input) { int * thePointer =(int *)input; * thePointer = 42; return * thePointer; } この関数はコンパイルするのは安全ではなく、固定する必要はありません(明らかに悪いです)。私は「*」の付いたすべてのタイプは禁止されていると言っていますが、このケースに興味があるかもしれないと思っていました。 –

+1

男、私はフォーマットするためにそのコードを得ることができません... –

+0

@JesseJoudrey - 私は値型の引数とローカル変数のアドレスを取ることは、C#のコンパイラは時折行うことだと思う。私はそれを見て覚えていますが、どこにはわからない。 – hoodaticus

関連する問題