Защита потоков в изолированном домене приложений
У меня есть домен приложения для размещения ненадежного кода / сборки. Я решил все проблемы с безопасностью с атрибутами безопасности, и она работает хорошо. Ненадежный код выполняется в выделенном потоке. CLR составляет 2,0. Это то, что у меня есть AppDomainShell AppDomainSeed, Shell работает в основном домене, seed - доверенный прокси / помощник в ненадежном домене.
Мне интересно ограничить создание новых тем и изменение приоритетов. На данный момент моя ненадежная сборка может установить ThreadPriority.Highest или убить операционную систему, создав 10k потоков. Существует SecurityPermissionFlag.ControlThread, но он предотвращает только сложные операции, такие как Abort().
Я смотрел на реализацию класса Thread, и в C# API его декларативной безопасности для этих простых операций не существует, остальная часть реализации является нативной.
Я думаю, я мог бы использовать некоторые функции Win32, чтобы запретить это на уровне ОС. Но как операционная система распознает поток / код / сборку, которой не доверяют? SetThreadPrincipal ()?
Есть ли какой-либо API CLR, которым можно злоупотреблять? Я предпочитаю решение без необходимости установки и переносимости для Mono:-/ хммм.
Любые другие идеи приветствуются. Спасибо!
3 ответа
Я обдумываю другое решение. Статический анализ CIL ненадежной сборки. Я мог искать через все методы, свойства, конструкторы. Распознавать ссылки на типы. Если я нашел ссылку на тип Thread, я выкидываю исключение безопасности и выгружаю сборку.
Мне очень нравится работа Jb Evain. Он создал Mono Cecil, но это довольно тяжелый вес. Он также разработал CIL Reader, только с отражением.NET.
Я создал Linq поверх отражения, используя CIL Reader. Использование выглядит так.
var myAssembly = typeof (Program).Assembly;
foreach (Type usedType in myAssembly.GetUsedTypes())
{
if (typeof (Thread).IsAssignableFrom(usedType) ||
typeof (ThreadPool).IsAssignableFrom(usedType) ||
typeof (ThreadPriority).IsAssignableFrom(usedType)
)
{
throw new SecurityException("Thread usage is banned here!");
}
}
Может быть, HostProtectionAttribute - это то, что нужно для ограничения манипулирования потоками ненадежным кодом?
Потоки выполняются в рамках одного процесса, и вы должны быть в безопасности, так как ваш ненадежный код не может изменить приоритет процесса. (См. MSDN здесь для деталей.)
Я не уверен, что даже создание 10k потоков внутри процесса обязательно убьет Windows - по крайней мере, не любую версию Windows выше Windows NT. Однако ваш процесс почти наверняка перестанет работать, поэтому вы можете рассмотреть два процесса и использовать механизм, такой как удаленное взаимодействие или WCF, для связи между ними.