Deshabilitar la reflexión de Java para el hilo actual
security reflection (3)
Bueno, puede anular SecurityManager.checkMemberAccess
y dar una definición más estricta. Sin embargo, realmente no funciona así. ¿Qué sucede, por ejemplo, si el código define un finalizador?
En la aclaración: Otras APIs utilizan la reflexión y otras APIs. Por ejemplo, java.beans, LiveConnect y Rhino. Un adversario podría desde dentro de un script, por ejemplo, crear un nuevo contexto de Rhino sin el obturador y, por lo tanto, arrancar en el JRE completo. Con un sistema abierto, una lista negra nunca puede ser terminada.
En resumen: para usar el modelo de seguridad de Java necesita trabajar con él, no contra él.
Necesito llamar a algún código de Java semi-confiable y quiero deshabilitar la capacidad de usar la reflexión durante la ejecución de ese código.
try{
// disable reflection somehow
someObject.method();
}
finally{
// enable reflection again
}
¿Se puede hacer esto con un SecurityManager, y si es así, cómo?
Clarificación / Contexto: Este es un seguimiento de otra pregunta sobre cómo restringir los paquetes a los que se puede llamar desde JavaScript / Rhino. La respuesta aceptada hace referencia a una entrada de blog sobre cómo hacerlo, y requiere dos pasos, el primero utilizando una API de Rhino (ClassShutter), el segundo desactivando la reflexión y Class.forName (). Estaba pensando que puedo hacer ese segundo paso de manera más limpia usando un SecurityManager (aprender sobre SecurityManager, que como se ha señalado, es una bestia compleja, en el camino).
Para resumir, quiero (desde el código, no configurar el archivo) desactivar Class.forName () y cualquier acceso a todo el paquete de reflexión.
Depende de lo que estés tratando de restringir.
En general, la API de acceso público no está restringida. Sin embargo, mientras no otorgue al código no confiable el ReflectPermission("suppressAccessChecks")
, no podrá obtener acceso a API no pública en otro paquete.
Si tiene una lista de paquetes a los que desea restringir todos los accesos, hay dos pasos. Primero, en las propiedades de Security
, incluya el paquete restringido en la lista package.access
. Luego, RuntimePermission("accessClassInPackage." + pkg)
su código de confianza RuntimePermission("accessClassInPackage." + pkg)
.
Una forma común de distinguir su código no confiable es cargarlo desde una ubicación diferente y referirse a los diferentes puntos de código en su archivo de política al otorgar permisos.
La arquitectura de seguridad de Java es muy poderosa, pero sé que también es complicada; Si desea un ejemplo más concreto, describa exactamente qué llamadas desea restringir y trataré de ser más explícito.
Hacer lo que quiera sin modificar el archivo java.policy
y / o el archivo java.security
sería muy difícil, tal vez imposible. java.security.Policy
representa la información en java.policy
, pero no ofrece acceso de escritura. Puede crear su propia implementación de Policy
e instalarla en tiempo de ejecución siempre que cualquier SecurityManager
existente lo permita.
Por otro lado, puede especificar un archivo java.policy personalizado como una opción de línea de comandos. Si está proporcionando una aplicación completa con algún tipo de lanzador, eso podría lograrse fácilmente. También proporciona cierta transparencia a sus usuarios. Un usuario sofisticado puede revisar los permisos que le gustaría otorgar a la aplicación.
Escribí un reemplazo de ClassShutter que permite el control de acceso detallado, por instancia, por método, por campo:
http://riven8192.blogspot.com/2010/07/java-rhino-fine-grained-classshutter.html