Как безопасно запускать пользовательские сценарии в песочнице 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. Может быть, это поможет некоторым другим найти это, как я только что сделал.