Проблемы безопасности интерпретатора онлайн C#

Я возился с идеей создания онлайн-интерпретатора C#, немного похожего на Codepad. Теперь есть очевидные проблемы безопасности:

  • Бесконечные петли
  • System.Diagnostics.Process.Start
  • Почти все пространство имен System.IO

Мои знания C# не совсем незначительны, но я уверен, что многие знают об этом гораздо больше, плюс то, о чем я не думал. Что бы вы были осторожны?

С небольшой точностью я планирую запустить это на небольшом VPS Linux с использованием Mono.

4 ответа

Решение

Используйте компилятор Mono в качестве сервисной возможности. Он может быть скомпилирован в совместимую с Silverlight библиотеку DLL (профиль клиента), и уже был, что вы можете проверить. Это должно решить некоторые ваши опасения по поводу IO.

На ум приходит отражение, так как вы можете перейти от GetType() к Assembly почти все, что вы хотите.

Перейдите по этой ссылке, и вы сможете узнать кое-что об онлайновых интерпретаторах C#, попробовать некоторые вещи и прочитать исключения для вывода, чтобы узнать, как они это сделали.

http://rextester.com/NWDF62346

На самом деле пользовательский код может делать все что угодно. было бы трудно заняться особыми случаями. На мой взгляд, лучший путь это:

a) создать домен приложения для песочницы только с разрешением на выполнение. Это обеспечивает множество вещей, таких как невозможность связываться с файловой системой или делать вызовы в собственные библиотеки.

б) создать новый процесс и запустить в нем свой домен приложений.

Затем тщательно контролируйте процесс на предмет потребления памяти и процессора. Если что-то пойдет не так - убей это. Обратите внимание, что это процесс, который вы можете убить, а не appdomain. С помощью appdomain вы можете попытаться выгрузить его, но если вредоносный код выполняется в пункте finally, он не будет работать.

Есть еще некоторые (известные мне) проблемы с этим:

  • Будьте осторожны, где вы размещаете скомпилированные пользователем сборки. На самом деле, даже в пользовательском коде домена с наименьшими привилегиями можно загружать сборки, находящиеся в одном каталоге, и выполнять их.
  • Я упоминал, что вы должны внимательно следить за процессом. Код (выполняется в пункте finally), который порождает потоки в бесконечном цикле, где каждый поток делает одно и то же, захватывает память очень быстро (по моим наблюдениям). если злоумышленник решит выполнить DOS-атаку с помощью такого кода - кто знает, что произойдет:) Возможно, один из способов использовать это - запустить пользовательский процесс с низким приоритетом, чтобы у контролирующих потоков была возможность надлежащего мониторинга в загруженной системе.

В общем, риск в любом случае есть. я тоже возился с этой идеей и вот текущий результат: rundotnet

Другие вопросы по тегам