Проблемы безопасности интерпретатора онлайн c # - PullRequest
7 голосов
/ 02 марта 2011

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 02 марта 2011

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

1 голос
/ 30 декабря 2011

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

http://rextester.com/NWDF62346

1 голос
/ 12 июня 2011

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

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

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

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

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

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

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

1 голос
/ 02 марта 2011

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

...