На самом деле пользовательский код может делать все что угодно. было бы трудно решать особые случаи. На мой взгляд, лучший путь это:
a) создать домен приложения для песочницы только с разрешением на выполнение. Это гарантирует множество вещей, таких как невозможность связываться с файловой системой или делать вызовы в собственные библиотеки.
b) создайте новый процесс и запустите в нем свой домен приложения.
Затем тщательно контролируйте процесс на предмет потребления памяти и процессора. Если что-то пойдет не так - убей это. Обратите внимание, что это процесс, который вы можете убить, а не appdomain. С помощью appdomain вы можете попытаться выгрузить его, но если вредоносный код выполняется в пункте finally, он не будет работать.
Есть еще некоторые (известные мне) проблемы с этим:
- Будьте осторожны, когда размещаете скомпилированные пользователем сборки. На самом деле даже пользовательский код домена с наименьшими привилегиями сможет загружать сборки, находящиеся в одном каталоге, и выполнять их.
- Я упоминал, что вы должны внимательно следить за процессом . Код (выполняется в пункте finally), который порождает потоки в бесконечном цикле, где каждый поток выполняет одно и то же, захватывает память очень быстро (по моим наблюдениям). если злоумышленник решит выполнить DOS-атаку с помощью такого кода - кто знает, что происходит :) Возможно, один из способов использовать это - запустить пользовательский процесс с низким приоритетом, чтобы надзорные потоки имели возможность надлежащего мониторинга в загруженной системе.
Так что, в общем, риск все равно есть. я тоже возился с этой идеей, и вот текущий результат: rundotnet