Лучший способ запустить ненадежный код - это изолировать его, мы делаем это много, когда обращаемся к вредоносным программам. Поскольку вы используете Docker, есть некоторые меры предосторожности, которые вам необходимо принять, которые не нужны при использовании виртуальных машин.
Самый безопасный способ сделать это - использовать другой контейнер Docker только для компиляции, выполнения и выполнения любой другой необходимой операции.
Давайте возьмем пример приложения, в которое пользователь отправляет код, и мы запускаем его для него, сравнивая его с ожидаемым результатом, как в соревнованиях по программированию, таких как Codeforces .
- Основное приложение получает код
- Основное приложение создает специальный контейнер Docker
- Основное приложение отправляет код в специальный контейнер с файлом, представляющим ожидаемый результат
- Специальный контейнер компилирует, выполняет и печатает вывод кода в файл и использует
diff output expected_output
- Специальный контейнер отправляет результат diff (в основном, true или false) в основное приложение
Таким образом, весь материал, связанный с кодом, отправленным пользователем, изолирован, поэтому он безопаснее.
Некоторые заметки:
- Контейнер, выполняющий код пользователя, должен запускать его, используя пользователя с низкими привилегиями для безопасности
- Если вам нужно получить выходные данные из кода, а не просто значение true или false из diff, то вам нужно быть уверенным, что его код не генерирует вредоносное ПО в качестве вывода, который вы сохраняете в файле и помещаете в него. основной сервер приложений
- Блокировка библиотек потоков, сетей, доступа к файловой системе и т. Д. Из кода пользователя помогает сделать его более безопасным