3

動的アセンブリへの計算を含むソース ファイルのランタイム コンパイルを実行する C# アプリケーションがあります。明らかに、これは深刻なセキュリティ上の問題を引き起こします。

次の「式」から、以下のコードが生成され、動的アセンブリが作成されます。

方式:

Int32 _index = value.LastIndexOf('.');
String _retVal = value.Substring(_index + 1);
return _retVal;

生成されたコード:

using System;
namespace Dynamics
{
  public class Evaluator
  {
    public Object Evaluate(String value)
    {
      // Begin external code
      Int32 _index = value.LastIndexOf('.');
      String _retVal = value.Substring(_index + 1);
      return _retVal;
      // End external code
    }
  }
}

次に、動的アセンブリが読み込まれ、Reflection を介して Evaluate メソッドが実行されます。これはうまくいきます。

問題は、悪意のあるコード インジェクションの可能性が非常に高いことです。そのため、「サンドボックス化された」スレッドで Evaluate メソッドを実行したいと考えています (アンマネージ API 呼び出しなし)。テスト目的で、組み込みの匿名 Windows ユーザーを使用しており、次のコードを作成しました。

Thread tSandbox = new Thread(
    new ParameterizedThreadStart(this.DoSandboxedEvaluation));
WindowsIdentity tIdentity = WindowsIdentity.GetAnonymous();
WindowsPrincipal tPrincipal = new WindowsPrincipal(i);

これにより、匿名ユーザーの ID とプリンシパルが得られます。アンマネージ API 呼び出しを使用せずに、指定されたセキュリティ コンテキストでそのスレッドのコードが実行されるように、これをスレッド tSandbox にどのように適用できますか?

ありがとう!

4

2 に答える 2

5

私の知る限り、別のユーザーになりすます唯一の方法は、管理されていないwin32 API(LogonUser()など)を使用することです...相互運用を通じてそれらを呼び出すことができます。

これのコードサンプルがここにあります

于 2009-04-08T14:14:57.653 に答える