线程可以作为另一个用户执行吗?(.NET 2.0/3.5)

Dan*_*Dan 3 .net c# security reflection sandbox

我有一个 C# 应用程序,它对包含计算的源文件执行一些运行时编译到动态程序集中。显然,这是一个严重的安全问题。

从下面的“公式”,将生成下面的代码,并创建一个动态程序集:

公式:

Int32 _index = value.LastIndexOf('.');
String _retVal = value.Substring(_index + 1);
return _retVal;
Run Code Online (Sandbox Code Playgroud)

生成的代码:

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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后加载动态程序集并通过反射执行 Evaluate 方法。这很好用。

问题是恶意代码注入的可能性很大,所以我想在“沙盒”线程(没有任何非托管 API 调用)中运行 Evaluate 方法。出于测试目的,我使用内置的匿名 Windows 用户,并提供了以下代码:

Thread tSandbox = new Thread(
    new ParameterizedThreadStart(this.DoSandboxedEvaluation));
WindowsIdentity tIdentity = WindowsIdentity.GetAnonymous();
WindowsPrincipal tPrincipal = new WindowsPrincipal(i);
Run Code Online (Sandbox Code Playgroud)

这给了我匿名用户的身份和主体。如何将这应用于线程 tSandbox 以便该线程上的代码在指定的安全上下文中运行,而不使用非托管 API 调用?

谢谢!

Arn*_*hea 5

AFAIK 模拟其他用户的唯一方法是通过非托管的 win32 api(例如,LogonUser())...您可以通过互操作调用它们。

有这样一个代码示例在这里