Безопасно работающий код пользователя

Я стремлюсь создать среду ИИ, где пользователи могут представить свой собственный код для ИИ и позволить им конкурировать. Язык может быть любым, но предпочтение отдается чему-то простому, например, JavaScript или Python.

В основном я вижу три варианта с парой вариантов:

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

1.1 Возьмите существующий язык и удалите его до основания. Просто удалите множество функций, скажем, из Python, пока не останется ничего, кроме вышеперечисленных (переменные, условия и т. Д.). Еще много работы, особенно если я хочу идти в ногу с апстримом (хотя я мог бы просто игнорировать апстрим).

Используйте встроенные функции языка, чтобы заблокировать его. Я знаю из PHP, что вы можете отключить функции и поиск, похоже, существуют похожие решения для Python (с большим количеством предостережений). Для этого мне нужно хорошо понимать все особенности языка и ничего не пропустить.

2.1. Создайте препроцессор, который отклоняет код с опасными объектами (желательно на основе белого списка). Аналогичен варианту 1, за исключением того, что мне нужно только реализовать синтаксический анализатор и не реализовать все функции: препроцессор долженПонимаю язык, так что вы можете иметь переменные с именем "eval", но не вызывать функцию с именем "eval". Еще много работы, но более управляемой, чем вариант 1.

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

Вручную прочитайте весь код. Выполняется в небольшом масштабе или с модераторами, хотя все еще утомительно и подвержено ошибкам (я могу пропустить такие вещи, какif (user.id = 0)).

Я предполагаю, что 2.2 работает следующим образом: запускайте оба ИИ на виртуальной машине (или чем-то еще) и ограничивайте ее только для связи с хост-машиной (без доступа к другому Интернету или локальной сети). Оба ИИ работают на отдельной машине и взаимодействуют друг с другом (ну, с игровым полем, и, таким образом, они видят позиции друг друга) через API, работающий на хосте.

Вариант 2.2 кажется наиболее выполнимым, но в то же время довольно хакерским ... Я позволил чьему-либо коду потерять свободу в виртуализированной или заблокированной среде, надеясь, что это сохранит его, предоставляя бесплатную игру для DoS или выход из среды. Опять же, большинство других вариантов не намного лучше.

TL; DR: по сути мой вопрос:как я могу позволить людям дать мне «логику» для ИИ (что, я думаю, легче всего сделать с помощью кода), а затем запустить его без ущерба для функциональности системы? На одном игровом поле должно быть минимум 2 ИИ.

Ответы на вопрос(1)

Ваш ответ на вопрос