2011-09-16 18 views
33

¿Cuáles son las opciones para ejecutar scripts (posiblemente malintencionados) enviados por el usuario en node.js, de forma segura? Es decir. en un entorno que impide que el código acceda a datos confidenciales y API?¿Cómo ejecutar scripts enviados por el usuario de forma segura en un sandbox node.js?

vm.runInNewContext(userScript, {}) es un punto de partida tentador ... pero parece que hay known issues allí.

El sandbox module parece interesante, pero también usa runInNewContext(), así que estoy un poco receloso.

+0

Recomiendo usar 'vm' porque es parte del núcleo del nodo. Y dado que el núcleo del nodo tiende a obtener sus errores corregidos simplemente asuma que el problema se solucionará – Raynos

+0

@Raynos no es un error. Los documentos dicen que solo está destinado a un código conocido. – thejh

+0

@thejh - cierto, pero la API se presta a la creencia bastante razonable de que el código se está ejecutando en un contexto completamente diferente, lo que implica que dicho código no debería poder acceder al contexto actual. Y espero que el * intento * de la API sea exactamente eso: proporcionar un entorno limitado en el que ejecutar scripts. Entonces ... creo que se puede hacer un caso bastante sólido de que esto es simplemente un error bien documentado. :) – broofa

Respuesta

29

Siempre debe ejecutar el código que no es de confianza en un proceso separado, que es exactamente lo que hace el módulo de zona de pruebas. Una razón simple es que congelará el nodo.

Empieza generando un proceso separado, que luego enviará el resultado serializado a JSON en su salida estándar. El proceso principal continúa ejecutándose independientemente de lo que haga el niño y puede desencadenar un tiempo de espera excedido.

El código que no es de confianza se envuelve en un cierre con strict mode (en JavaScript normal, puede usar arguments.callee.caller para acceder a datos fuera de su alcance). Finalmente, se pasa un objeto muy limitado global para evitar el acceso a la API del nodo. El código que no es de confianza solo puede hacer cálculos básicos y no tiene acceso a archivos o sockets.

Mientras que usted debe leer el código de caja de arena como una inspiración, yo no recomendaría el uso tal y como está:

  • El código está haciendo viejo y no se ha actualizado durante 7 meses.
  • El módulo Child Process en el nodo ya proporciona la mayoría de las características que necesita, especialmente child_process.fork().
  • El canal de IPC proporcionado por child_process.fork probablemente tiene mejores actuaciones.

Para mayor seguridad, también podría considerar el uso de setuid-sandbox. Es el código utilizado por Google Chrome para evitar que los procesos de tabulación accedan al sistema de archivos. Tendría que hacer un módulo nativo, pero este example parece sencillo.

+3

Los métodos en el módulo 'vm' ahora soportan un parámetro' timeout' que te permite ejecutar de forma segura 'while (true) {}'. Obviamente, no aborda las preocupaciones de seguridad, pero sí resuelve bucles infinitos. –

+0

@AndrewPaprocki ¿Puedes vincular a los documentos donde se muestra el tiempo de espera? –

+0

@RobFox esto está en v0.11, http://nodejs.org/docs/v0.11.13/api/vm.html –

8

Hay a newer module on github called vm2 que resuelve algunas de estas preocupaciones, especialmente en las aplicaciones Node.JS. Tal vez eso ayude a otros a encontrarlo, como acabo de hacer.

Cuestiones relacionadas