実際、ユーザーコードは何でもできます。特殊なケースに取り組むのは難しいでしょう。私の意見では、最善の方法は次のとおりです。
a)実行権限のみを持つサンドボックス appdomain を作成します。これにより、ファイル システムをいじったり、ネイティブ ライブラリを呼び出せなくなったりするなど、多くのことが保証されます。
b)新しいプロセスを作成し、その中でアプリドメインを開始します。
次に、プロセスのメモリと CPU の消費量を厳密に監視します。何か問題が発生した場合は、それを殺してください。appdomain ではなく、強制終了できるプロセスであることに注意してください。appdomain を使用するとアンロードを試みることができますが、finally 句で悪意のあるコードが実行されている場合は機能しません。
これにはまだいくつかの(私が知っている)問題があります:
- ユーザーがコンパイルしたアセンブリを配置する場所に注意してください。実際には、最小特権の appdomain ユーザー コードでも、同じディレクトリにあるアセンブリを読み込んで実行できます。
- プロセスをしっかりと監視する必要があると述べました。各スレッドが同じことを行う無限ループでスレッドを生成するコード (finally 句で実行) は、(私の観察では) 非常に高速にメモリを取得します。攻撃者がそのようなコードで DOS 攻撃を行うことを決定した場合 - 何が起こるかは誰にもわかりません :) おそらく、これを利用する 1 つの方法は、ロードされたシステムで監視スレッドが適切に監視できるように、優先度の低いユーザー プロセスを開始することです。
したがって、とにかくリスクがあります。私もこのアイデアをいじっていましたが、これが現在の結果です: rundotnet