2015-07-14 2 views
1

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

В основном я вижу три варианта с несколькими вариантами:

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

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

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

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

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

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

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

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


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

+2

Выполнение этого на уровне языка слишком подвержено ошибкам. Почти любая функция языка может быть использована неправильно. Даже то, что кажется безвредным, как регулярные выражения, может голодать систему ресурсов ЦП с использованием [катастрофического обратного слежения] (http://www.regular-expressions.info/catastrophic.html). Контейнер может решить многие из этих проблем. Используя что-то вроде Docker, вы можете указать квоты CPU, чтобы ни один контейнер не мог голодать CPU. Вы также можете запустить контейнер как пользователь с ограниченным доступом к диску. – vcsjones

+0

@vcsjones Хороший совет, пожалуйста, напишите как ответ. Чтобы уточнить, вы имеете в виду любой вариант на основе языка, включая написание собственного языка? – Luc

ответ

1

Это действительно плагиновая система, поэтому исследование того, как другие реализуют плагины, является хорошей отправной точкой.В частности, я бы посмотрел на веб-браузеры, такие как Chrome и Safari и их плагины.

Общей темой в современных системах плагинов является изоляция процесса. В идеале вы должны запустить плагин в своем собственном пространстве процесса в песочнице. В OS X посмотрите XPC, который явно разработан для этой проблемы. В Linux (или более переносимо) я, вероятно, посмотрю на NaCl (Native Client). JVM также предназначен для обеспечения песочницы и предлагает богатый выбор языков. (Тем не менее, я лично не считаю JVM очень сильной песочницей. У нее были проблемы с безопасностью.)

В общем, мои предпочтения в отношении этих проектов - это API-интерфейс, не относящийся к языку. Я чаще всего использую API REST (или «REST-like»). Это позволяет плагину быть очень ограниченным, не ограничивая выбор языка. Мне нравится простой HTTP для связи, когда это возможно, потому что он имеет богатую поддержку на многих языках, поэтому он не ограничивает плагин. Фактически, учитывая ваше описание, вам даже не нужно будет запускать плагин на вашем оборудовании (и, конечно же, не на главном сервере). Создание удаленных клиентов плагинов устраняет многие потенциальные проблемы.

Но в конечном счете, я думаю, что что-то вроде вашего «2.2» - правильное направление.

+0

Я думал о API. Причина, по которой я (в ретроспективе, неверно) сразу же отверг идею публичного API, когда люди связывают свои боты, была латентностью. Решите одну головную боль; начать еще (я был в многопользовательских играх в режиме реального времени раньше, довольно сложно получить право). Но, возможно, запустив код в виртуализированных средах и позволяя ему подключаться к API на одном физическом хосте (или локальной сети), я могу обойти проблему латентности. Хм. Будьте уверены, возможно, ответ позже. Благодаря! – Luc

Смежные вопросы