Лучший способ запустить ненадежный исполняемый файл от пользователя на сервере - PullRequest
1 голос
/ 07 июня 2019

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

Будет ли докер каким-то образом полезным здесь?Если «да», то как?

К вашему сведению, я использую архитектуру микросервисов.И Go для разработки этого сервиса на стороне сервера (code-runner).

Ответы [ 2 ]

1 голос
/ 07 июня 2019

[Каков] Лучший способ запустить ненадежный исполняемый файл от пользователя на сервере?

Совсем нет.

Песочница жесткая . Попробуйте использовать игровую площадку, которая делает именно то, что вам нужно.

Или: переопределите игровую площадку в соответствии с вашими потребностями. https://blog.golang.org/playground Может помочь вам начать.

Только не забудьте запретить опасные пакеты, такие как unsafe, runtime, os / exec и все из сети.

1 голос
/ 07 июня 2019

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

Самый безопасный способ сделать это - использовать другой контейнер Docker только для компиляции, выполнения и выполнения любой другой необходимой операции.

Давайте возьмем пример приложения, в которое пользователь отправляет код, и мы запускаем его для него, сравнивая его с ожидаемым результатом, как в соревнованиях по программированию, таких как Codeforces .

  1. Основное приложение получает код
  2. Основное приложение создает специальный контейнер Docker
  3. Основное приложение отправляет код в специальный контейнер с файлом, представляющим ожидаемый результат
  4. Специальный контейнер компилирует, выполняет и печатает вывод кода в файл и использует diff output expected_output
  5. Специальный контейнер отправляет результат diff (в основном, true или false) в основное приложение

Таким образом, весь материал, связанный с кодом, отправленным пользователем, изолирован, поэтому он безопаснее.

Некоторые заметки:

  • Контейнер, выполняющий код пользователя, должен запускать его, используя пользователя с низкими привилегиями для безопасности
  • Если вам нужно получить выходные данные из кода, а не просто значение true или false из diff, то вам нужно быть уверенным, что его код не генерирует вредоносное ПО в качестве вывода, который вы сохраняете в файле и помещаете в него. основной сервер приложений
  • Блокировка библиотек потоков, сетей, доступа к файловой системе и т. Д. Из кода пользователя помогает сделать его более безопасным
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...