Автоматическая компиляция и запуск стороннего кода
В настоящее время я пишу инструмент автоматической проверки исходного кода. В основном студенты должны загружать свои файлы исходного кода C# в качестве решения для различных задач. Сервер компилирует эти файлы в рамках и проверяет программу на наличие разных входных файлов. Если результат, сгенерированный программой, действителен (равен предварительно заданному результату), программа действительна, и студент получает баллы за программу.
Но я не думаю, что могу доверять студентам;) Они могут попытаться получить доступ к файлу или выполнить другие плохие действия на сервере.
Что я могу сделать, чтобы ограничить доступ к минимуму?
Что мне нужно учитывать?
Уже думал о:
- доступ к файлу
- Максимум. время исполнения
- запуск других программ
- заниматься сетевыми вещами
- отражение
В настоящее время единственным способом проверки кода, который я мог себе представить, был поиск по ключевым словам типа "Файл", "Сеть", "Процесс", ... с использованием регулярных выражений.
Но я уверен, что это ОЧЕНЬ ненадежно.
Какие-либо предложения?
4 ответа
Если это просто аспект безопасности, вы должны скомпилировать и запустить программы в песочнице. Рассмотрим виртуальную машину, если у вас есть доступ к ней. Сканирование исходного кода на наличие уязвимостей выглядит довольно сложной задачей (и, честно говоря, если учащийся может достичь эксплойта, в то же время получая код для правильного вывода, вам следует учитывать бонусные баллы:P)
Если вы хотите использовать Roslyn CTP, вы можете взглянуть на Compilify. Вам не понадобится масштабировать инфраструктуру, ключевой частью является создание песочницы.
Компиляция исходного кода студентов не должна представлять каких-либо рисков для безопасности, однако для выполнения кода студентов требуется песочница, поскольку код не заслуживает доверия. Домены приложений могут использоваться для этой цели, и им могут быть назначены определенные разрешения (например, "Выполнение" или "FileIO"). Смотрите эту статью на MSDN. Возможно, вы захотите добавить некоторые средства для выполнения целевого кода в другом потоке, чтобы вы могли прервать его, если истечет время ожидания.
Если вас беспокоит сбой программы студентами (например, бесконечно рекурсивный вызов, вызывающий исключение StackruException), вам придется выполнить все вышеперечисленное в отдельном хост-процессе, который может связаться с вашим основным приложением.
Обновить
На самом деле, компиляция может представлять проблему, так как msbuild может выполнять произвольный код с помощью задач в файле proj. Я не думаю, что запуск компилятора (csc.exe) может вызвать проблемы, но вам придется создавать командную строку самостоятельно.
Также вы могли бы запустить компиляцию как новый пользователь System.Diagnostics.Process с очень ограниченными разрешениями. Это не защитит от бесконечных циклов и тому подобного, но вы, вероятно, должны проверять это вручную в своей собственной программе, потому что даже начинающий программист может отправить случайный бесконечный цикл.
http://www.curlybrace.com/words/2009/06/04/run-external-application-as-another-user-in-c/