Проблемы безопасности интерпретатора онлайн C#
Я возился с идеей создания онлайн-интерпретатора C#, немного похожего на Codepad. Теперь есть очевидные проблемы безопасности:
- Бесконечные петли
- System.Diagnostics.Process.Start
- Почти все пространство имен System.IO
Мои знания C# не совсем незначительны, но я уверен, что многие знают об этом гораздо больше, плюс то, о чем я не думал. Что бы вы были осторожны?
С небольшой точностью я планирую запустить это на небольшом VPS Linux с использованием Mono.
4 ответа
Используйте компилятор Mono в качестве сервисной возможности. Он может быть скомпилирован в совместимую с Silverlight библиотеку DLL (профиль клиента), и уже был, что вы можете проверить. Это должно решить некоторые ваши опасения по поводу IO.
На ум приходит отражение, так как вы можете перейти от GetType() к Assembly
почти все, что вы хотите.
Перейдите по этой ссылке, и вы сможете узнать кое-что об онлайновых интерпретаторах C#, попробовать некоторые вещи и прочитать исключения для вывода, чтобы узнать, как они это сделали.
На самом деле пользовательский код может делать все что угодно. было бы трудно заняться особыми случаями. На мой взгляд, лучший путь это:
a) создать домен приложения для песочницы только с разрешением на выполнение. Это обеспечивает множество вещей, таких как невозможность связываться с файловой системой или делать вызовы в собственные библиотеки.
б) создать новый процесс и запустить в нем свой домен приложений.
Затем тщательно контролируйте процесс на предмет потребления памяти и процессора. Если что-то пойдет не так - убей это. Обратите внимание, что это процесс, который вы можете убить, а не appdomain. С помощью appdomain вы можете попытаться выгрузить его, но если вредоносный код выполняется в пункте finally, он не будет работать.
Есть еще некоторые (известные мне) проблемы с этим:
- Будьте осторожны, где вы размещаете скомпилированные пользователем сборки. На самом деле, даже в пользовательском коде домена с наименьшими привилегиями можно загружать сборки, находящиеся в одном каталоге, и выполнять их.
- Я упоминал, что вы должны внимательно следить за процессом. Код (выполняется в пункте finally), который порождает потоки в бесконечном цикле, где каждый поток делает одно и то же, захватывает память очень быстро (по моим наблюдениям). если злоумышленник решит выполнить DOS-атаку с помощью такого кода - кто знает, что произойдет:) Возможно, один из способов использовать это - запустить пользовательский процесс с низким приоритетом, чтобы у контролирующих потоков была возможность надлежащего мониторинга в загруженной системе.
В общем, риск в любом случае есть. я тоже возился с этой идеей и вот текущий результат: rundotnet