2012-04-19 9 views
14

Estamos intentando proporcionar elementos de secuencias de comandos en un producto "enterprisy". Nos gustaría usar Groovy, pero estamos teniendo dificultades para asegurar cosas muy básicas.Groovy Script Security no confiable en Java

Por ejemplo, nos gustaría evitar que un cliente simplemente va

Class.forName("my.company.internal.SecruityTools").runAsAwesome(...) 

Hemos instalado un controlador de seguridad con una política que sólo permite accesDeclaredMembers y han sobrescrito el método checkPackageAccess y sólo permitir que los paquetes de la lista blanca . Desafortunadamente, la cadena classLoader predeterminada parece omitir esto y cargar la clase de cualquier forma.

Parecería que este es un problema bastante común/discutido, pero no puedo encontrar una biblioteca o incluso una buena publicación de blog sobre cómo bloquear scripts no confiables en el contexto de una aplicación mucho mayor .

¿Alguien ha hecho esto con éxito? ¿Me faltan algunas publicaciones/conceptos bastante obvios? ¿Ya hay una biblioteca sólida para esto? ¿Tal vez Groovy.tinFoilHatMode(true)?

+4

Tal vez [esta respuesta en una pregunta similar] (http://stackoverflow.com/a/6490674/274466) es de alguna ayuda? La respuesta apunta a [esta publicación del blog] (http://www.jroller.com/melix/entry/customizing_groovy_compilation_process), que ofrece un mecanismo plausible para prevenir este tipo de cosas ... – ig0774

+0

Si no me equivoco, hay bastantes características de lenguaje dinámico que podrían evitar cualquier tipo de protección AST. Algo así como object. ("Ge" + t "+" ClassLoader ")." Fo "+ $ rname o algo así. –

+1

@Ambience ¿Has probado los procedimientos sugeridos por ig0774? No creo que puedas evadirlos con trucos como tú sugieres, y si puedes, esto es algo que debería informarse al equipo de Groovy lo antes posible. –

Respuesta

5

Eche un vistazo a Groovy Sandbox. Puede usarlo para detener cosas como System.exit(0) o new File(“/etc/passwd”).

1

¿Has mirado en el uso de GroovyCodeSource

+0

Corrígeme si estoy equivocado, pero eso parece estar implícitamente envuelto alrededor de las fuentes compiladas y simplemente ayuda a que una política se reduzca para las secuencias de comandos. Nuestro código define una política muy estricta para TODAS las fuentes en el hilo de evaluación. Así que esto nos ayudaría a "ampliar" nuestro permiso, pero no hace nada mágico para hacer que los permisos Class.forName comiencen a ser validados (no es que pueda ver solo las referencias groovy internas). –

1

Lo que terminamos haciendo era una combinación de las cosas de arriba, pero la salsa de magia real estaba implementando this AST transformer que envuelve cualquier expresión (incluyendo this, o un implícito this) en una comprobación de acceso.