¿Cómo hago sandbox para el usuario JS sin utilizar una VM, un transpiler o una API basada en la lista blanca?

7

He investigado y existen algunas formas sólidas para el usuario de sandbox JS, a saber:

  • Use una máquina virtual JS que ejecute JS utilizando una forma de espacio aislado de js, como VM.js
  • Use un transpiler como Google Caja, que agrega controles adicionales para preservar ciertos invariantes y no permite rutas de código específicas
  • Use un dominio cruzado (y / o sandbox ed) iframe , posiblemente también con un trabajador web, por ejemplo. Encarcelado

Lamentablemente, ninguno de estos funciona bien de forma inmediata para mi aplicación. Estoy tratando de construir una alternativa jsperf.com (es decir, un sistema de evaluación comparativa JS basado en la web), por lo que las dos primeras están fuera, ya que afectarían el rendimiento del código proporcionado por el usuario, lo que invalida completamente los resultados de la evaluación comparativa.

Jailed está más cerca, pero tampoco es una gran alternativa porque A) su enfoque de lista blanca es tan restrictivo que mi sitio no podría probar el rendimiento de muchas características de la web (operaciones DOM, IndexedDb, WebWorkers , LocalStorage, etc.) sin una gran cantidad de listas blancas que ni siquiera estoy seguro de que funcionaría y B) no estoy seguro de qué tan bien mantenido (y por lo tanto seguro) se da cuánta actividad hay en su repositorio de GitHub.

¿Cuál es el sistema más permisivo (en términos de cercanía a la ejecución de aplicaciones sin caja) que puedo usar de manera segura para ejecutar el JS proporcionado por el usuario para la evaluación comparativa? ¿Es suficiente un iframe en espacio aislado para que los puntos de referencia puedan acceder al menos a algunos DOM y otras API web? ¿Es realmente necesario el trabajador web? ¿Qué hacen jsfiddle y similares?

    
pregunta 0x24a537r9 01.09.2016 - 07:28
fuente

1 respuesta

1

La definición de ingeniería de software de un sandbox es un entorno de ejecución con restricciones de seguridad específicas mantenidas. Esto significa que el JavaScript del usuario no debe poder aprovechar ni afectar el JavaScript de la página web que lo contiene.

Una implementación de iframe no lo hará

  • Garantice que las condiciones de tiempo de ejecución del código de espacio aislado serán las mismas que si se ejecutaran en un documento independiente ni
  • Asegúrese de que el documento principal no se vea afectado y posiblemente se estrelle con el código del recinto de seguridad.

Si tiene suficiente control de la red y del servidor web, puede establecer una independencia bastante segura y un entorno de ejecución auténtico al permitir que un usuario autenticado a través de HTTPS proporcione JavaScript de caja de arena a un sitio o sitios secundarios completamente independientes. El uso de subdominios puede reducir el costo de este enfoque. Es posible que tenga que usar el hack target = '_ blank' que algunos consideran una violación del modelo www.

Para tener cuidado de no crear agujeros de seguridad con esta disposición, hay algunas recomendaciones.

  • Use una inclusión del lado del servidor que adquiera con precisión el código del recinto de seguridad.
  • Apriete con cuidado todo el acceso al directorio del servidor web.
  • Valide la sintaxis de JavaScript.
respondido por el FauChristian 26.01.2017 - 04:30
fuente

Lea otras preguntas en las etiquetas