2010-01-13 12 views
7

Tengo una aplicación de Java que utiliza JNI en algunas partes para hacer algo de trabajo. Sigue la carga habitual de DLL y luego llama a los métodos nativos de DLL. ¿Hay alguna manera de restringir lo que los métodos nativos pueden hacer desde la aplicación java? Por ejemplo, ¿podemos restringir las DLL para no abrir ningún archivo o no abrir ningún socket incluso si tiene el código para hacerlo? Simplemente puede prohibir las DLL que carga para hacer ciertas cosas, puede ser al iniciar sesión o lanzar una excepción.Restringir la funcionalidad de código nativo de Java

+0

Pregunta interesante, pero también sería muy bueno saber más sobre lo que estás tratando de hacer. ¿Estás tratando de permitir la carga de archivos DLL de terceros en tu aplicación Java, pero temen que puedan hackearlo? Esta es una amenaza muy real. Una DLL puede entrar en la máquina Java y obtener todo de ella. –

+1

@Clark: Exactamente. No podemos decir tercero. Pero digamos que tenemos aplicación java. Y definimos un marco de trabajo mediante el cual cualquiera puede desarrollar una DLL y usarla con nuestra aplicación. Y quiero restringir lo que pueden obtener del marco. Espero que entiendas la imagen. – vpram86

Respuesta

7

Me gustó Gregory Pakosz 'answer mucho. Sin embargo, lo que podrías hacer es sandbox la instancia de Java. Inicie la aplicación Java en un contexto restringido.

En Windows o Unix puede crear un usuario que está limitado a un directorio determinado y solo tiene acceso a algunas DLL. Por lo tanto, el DLL llamado desde JNI puede hacer lo que quiera, pero no llegará muy lejos, porque el usuario que ejecuta Java no puede hacer mucho.

Si su programa Java necesita hacer cosas privilegiadas, el lado de Java tendrá que hablar con otro programa (Java o no) para hacer sus 'cosas privilegiadas para ello.

Solo tenga en cuenta que, si no puede confiar en la DLL, tampoco puede confiar en el código Java, ya que la DLL podría haber "pirateado" la máquina Java. Por otro lado, ninguna cosa desagradable debería poder escapar de los límites del usuario con el que se ejecutan. (Excepto errores de configuración o un error en el sistema operativo.)

+1

+1 - estaba a punto de escribir algo similar.Lo único que agregaría es que podría valer la pena envolver el archivo DLL en una especie de capa de servicio a la que se accede desde la aplicación Java. Pero eso puede generar gastos indirectos inaceptables. – kdgregory

+0

Sugerencia agradable. Muchas gracias Clark y Gregory! – vpram86

1

Normalmente, ejecutaría su aplicación bajo el Administrador de seguridad de Java, pero no creo que tenga ningún efecto en el código que se ejecuta a través del JNI.

+0

Gracias. Me preguntaba si podemos restringir la creación o eliminación de archivos al menos configurando algunas propiedades en el administrador de seguridad con respecto a la carga de DLL. – vpram86

8

No, no puedes. La DLL se carga como un todo y luego el lado de Java no tiene control sobre lo que está haciendo el código nativo.

Una solución podría ser una especie de hombre en el enfoque medio. Esto implicaría codificar una DLL "shell" que tenga la misma interfaz que la DLL original. Le dice a Java que cargue una DLL de "shell", por ejemplo, colocándola en una ubicación específica y utilizando la propiedad java.library.path. Luego, el rol de la DLL "shell" es cargar la DLL "verdadera" al ponerla en una caja de seguridad y redirigir las funciones estándar. Esto suena como un gran dolor y esto sucedería en el lado nativo de las cosas, no de Java.

+0

Gracias. Entiendo que. ¿No hay forma de que podamos decirle al proceso java que lo cargue con la propiedad kind-of-restriction? – vpram86

+0

¡Guau! Muchas gracias. Pero esto vincula el shell con el DLL original y si tenemos muchos DLLs, también deberíamos tener correpondientes DLLs de shell :(que como dijiste es realmente pesado. Estaba pensando si esto es posible a través de alguna propiedad mientras se carga o se inicia JVM Pero gracias por la información. – vpram86

1

Puede implementar algún tipo de configuración que pueda obtener su código JNI. Por ejemplo, en un sistema UNIX, podría crear grupos para tipos especiales de privilegios, y verificar si el usuario actual tiene los privilegios necesarios, sino simplemente devolver 0 o algo.

+0

Exactamente. ¡Muchas gracias!. Este fue el que se discutió en la respuesta de Clark. Podríamos usar lo mismo en Unix también. – vpram86

Cuestiones relacionadas