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

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

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

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

2 ответа

Решение

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

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

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

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

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

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

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

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

Другие вопросы по тегам