Архитектура для песочницы компиляции и выполнения ненадежного исходного кода - PullRequest
2 голосов
/ 06 апреля 2011

SPOJ - это веб-сайт, который перечисляет головоломки программирования, а затем позволяет пользователям писать код для решения этих головоломок и загружать свой исходный код на сервер. Затем сервер компилирует этот исходный код (или интерпретирует его, если это интерпретируемый язык), запускает ряд модульных тестов в отношении кода и проверяет, правильно ли он решает проблему.

Каков наилучший способ реализовать что-то вроде этого - как вы изолируете ввод пользователя, чтобы он не мог скомпрометировать сервер? Стоит ли использовать SELinux, chroot или виртуализацию? Все три плюс кое-что еще, о чем я не думал?

Как приложение надежно передает результаты за пределы тюрьмы, а также гарантирует, что результаты не будут скомпрометированы? Как бы вы, например, не допустили, чтобы приложение записывало на диск огромные порции бессмысленных данных или другие вредоносные действия?

Мне действительно любопытно, так как это просто очень рискованное приложение для запуска.

1 Ответ

1 голос
/ 07 апреля 2011

Служебная тюрьма, запущенная из ограниченной учетной записи пользователя, звучит как лучшая отправная точка (т. Е. NOT root или тот же пользователь, который запускает ваш веб-сервер)

Чтобы предотвратить огромные порции бессмысленных данныхбудучи записанным на диск, вы можете использовать дисковые квоты или отдельный том, который вы не против заполнить (при условии, что вы не проводите параллельное тестирование под одним и тем же пользователем - или вы в конечном итоге столкнетесь с раздражающими условиями гонки)

Если вы хотите сделать что-то более масштабируемое и безопасное, вы можете использовать для связи динамические виртуализированные хосты с вашим собственным сервером / клиентским решением - у вас есть пул «агентов», которые получают инструкции для копирования и компиляции из репозитория X илиподелиться, затем выполнить ряд тестов и записать результат обратно через тот же протокол сервер / клиент.Ваш хост-процесс может отслеживать чрезмерное использование диска и, при необходимости, сообщать о предупреждениях, агенты могут выполнять или не выполнять код в изолированной тюрьме, а если вы супер параноик, вы уничтожаете агента после каждого запуска и запускаете новую виртуальную машину.когда следующий образец готов к тестированию.Если вы выполняете эту крупномасштабную работу в облаке (например, более 100 агентов, работающих на EC2), у вас будет достаточно раскрутки, чтобы удовлетворить спрос и, следовательно, снизить ваши расходы.Опять же, если вы собираетесь масштабироваться, вы можете использовать что-то вроде Amazon SQS для буферизации запросов, или если вы делаете экспериментальный пример проекта, тогда вы можете сделать что-то намного проще (просто подумайте о распределенных системах параллельной обработки, например, seti @ home)

...