У меня есть приложение 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
}
}
}
Затем загружается динамическая сборка, а метод Evaluate выполняется с помощью Reflection. Это прекрасно работает.
Проблема в том, что вероятность внедрения вредоносного кода огромна, поэтому я хочу запустить метод Evaluate в потоке «песочницы» (без каких-либо неуправляемых вызовов API).
В целях тестирования я использую встроенного анонимного пользователя Windows и придумала следующий код:
Thread tSandbox = new Thread(
new ParameterizedThreadStart(this.DoSandboxedEvaluation));
WindowsIdentity tIdentity = WindowsIdentity.GetAnonymous();
WindowsPrincipal tPrincipal = new WindowsPrincipal(i);
Это дает мне личность и принципала анонимных пользователей. Как это можно применить к потоку tSandbox, чтобы код в этом потоке выполнялся в указанном контексте безопасности, без использования неуправляемых вызовов API?
Спасибо!