2009-08-28 21 views
16

Estoy usando javax.scripting para agregar soporte para ejecutar JavaScripts arbitrarios cargados por el usuario en el servidor. ¡Obviamente quiero asegurar esos guiones!¿Cómo puedo asegurar que los scripts se ejecuten usando javax.scripting?

Rhino, por sí solo, tiene un marco para asegurar scripts en tiempo de ejecución. La documentación para javax.scripting, sin embargo, no menciona la seguridad, los permisos o las clases restringidas disponibles para el script. Entonces, ¿esto es solo un gran agujero en la API javax.scripting que no ofrece un marco para proteger los scripts que ejecuta?

No quiero usar Rhino directamente porque originalmente lo intenté pero tuve algunos problemas al exponer instancias de Java al script en ejecución. El marco javax.scripting lo hizo (que usa Rhino bajo el capó) y convirtió estos scripts triviales y simplificados en un servidor multiproceso.

Me gustaría poner en una lista blanca las clases de Java a las que se puede acceder/instanciar dentro del script en ejecución. ¿Alguien puede señalarme un ejemplo o documentación sobre cómo lograr esto?

Respuesta

18

Resulta que javax.scripting no ofrece un marco de seguridad. Después de buscar, encontré un documento en el caché de Google que sugería intentar usar el marco doPrivilegedAction de Java, pero después de algunos experimentos, no pude obtener esto para evitar que los scripts abran sockets o accedan al sistema de archivos.

Después de hacer esta pregunta, descubrí que previamente se había preguntado aquí en StackOverflow: How can you run Javascript using Rhino for Java in a sandbox? En esa página, indica falsamente que el Rhino incluido en el JDK6 ya tiene seguridad resuelta. Como indiqué, pude abrir tomas de corriente y otras acciones dañinas del guión.

Al final abandoné javax.scripting e incrustó Rhino directamente. Con la construcción de una costumbre ContextFactory que es también un ClassShutter yo era capaz de lograr dos resultados fácilmente:

  1. Limita la hora de la ejecución del script a un límite de tiempo máximo
  2. restringe el acceso de clases a las que he lista blanca, la cual es básicamente java.lang.* y unas pocas clases selectas en la jerarquía de mi servidor.

CodeUtopia (que no se puede vincular a porque, como un nuevo usuario, no se me permite vincular a varias páginas en un solo puesto; pero está ligada en el otro post StackOverflow) era valioso en la descripción la arquitectura ClassShutter y la propia página de API ContextFactory de Rhino describe cómo crear un ContextFactory personalizado.

2

http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/ describe una manera de sandbox rhino, y javax.scripting utiliza Rhino como el motor de scripts JS, por lo que debería poder utilizar lo anterior, aunque los nombres de los paquetes pueden diferir.

He estado trabajando en una aplicación de Java que necesitaba Rhino para la creación de scripts. La aplicación necesitaría ejecutar el código de JavaScript no confiable de terceros, así que tuve que encontrar una forma de bloquear el acceso a todos los métodos Java , excepto los que yo quería. Esto no sería un problema si hay era una manera fácil de deshabilitar LiveConnect - la función de Rhino que proporciona acceso Java a las secuencias de comandos - pero no existe tal cosa.

Sin embargo, después de una gran cantidad de excavación alrededor, finalmente encontré una manera de hacer esto sin demasiada piratería. En hecho, se puede hacer simplemente extendiendo algunas de las clases de Rhino, y usando los ajustadores provistos para anular algunos de los predeterminados.

0

FYI, esto ahora es posible en la nueva implementación Java 8 de javax.scripting que utiliza un nuevo motor llamado Nashorn. Ver Secure Nashorn JS Execution

Cuestiones relacionadas