Подтвердить что ты не робот

Как безопасно запускать написанные пользователем сценарии в песочнице node.js?

Каковы параметры запуска (возможно, вредоносных) сценариев, представленных пользователем в node.js, безопасно? То есть в среде, которая запрещает коду получать доступ к конфиденциальным данным и API?

vm.runInNewContext(userScript, {}) является заманчивой отправной точкой... но похоже, что там есть известные проблемы.

sandbox module выглядит интересным, но использует runInNewContext(), поэтому я немного разбираюсь в нем.

4b9b3361

Ответ 1

Вы всегда должны запускать ненадежный код в отдельном процессе, что и делает модуль песочницы. Простая причина в том, что vm.runInNewContext('while(true){}', {}) заморозит node.

Он начинается с создания отдельного процесса, который позже отправит результат, сериализованный в JSON, на его stdout. Родительский процесс продолжает выполняться независимо от того, что делает ребенок и может вызвать таймаут.

Неверный код затем завернут в закрытие с строгим режимом (в обычном JavaScript вы можете использовать arguments.callee.caller для доступа к данным за пределами ваш объем). Наконец, для ограничения доступа к API node передается очень ограниченный объект global. Неверный код может выполнять только базовые вычисления и не имеет доступа к файлам или сокетам.

Пока вы должны прочитать код песочницы как вдохновение, я бы не рекомендовал его использовать, как есть:

  • Код стареет и не обновляется в течение 7 месяцев.
  • Модуль Child Process в node уже предоставляет большинство необходимых вам функций, особенно child_process.fork().
  • Канал IPC, предоставленный child_process.fork, вероятно, имеет лучшие характеристики.

Для повышения безопасности вы также можете использовать setuid-sandbox. Это код, используемый Google Chrome для предотвращения доступа к процессам вкладок в файловой системе. Вам нужно будет создать собственный модуль, но этот example кажется простым.

Ответ 2

Существует новый модуль github под названием vm2, который затрагивает некоторые из этих проблем, особенно в приложениях Node.JS. Возможно, это поможет некоторым другим найти его, как я только что сделал.

Ответ 3

Вы можете проверить эту статью на Medium.