spec cert java security

java - cert - ¿Cuándo se debe usar AccessController.doPrivileged()?



java. security. cert (4)

  1. ..a través de un método intermedio que tiene permisos . No, los permisos efectivos finales son la intersección de todos los permisos en la pila de dominios. Entonces supongamos que una operación requiere un permiso B para ejecutar, y digamos que una LIB intermedia tiene dos permisos B y A. Ahora, cuando algún código no confiable con solo permiso A llama a través de LIB, el conjunto de permisos efectivos es (A intersect (A+B)) = A Por lo tanto, el código que no es de confianza no puede explotar el LIB intermedio para obtener permisos adicionales.

  2. ¿Cuándo se debe usar doPriveleged? -> Hay muchas operaciones en Java que requieren que el dominio llamante tenga ciertos permisos para la ejecución exitosa de esas operaciones. System.getProperty es una de esas operaciones. Todas las operaciones relacionadas con archivos también necesitan permisos especiales. Cuando utiliza AccessController.doPrivileged para invocar esas operaciones, la operación se ejecuta con todos los derechos (permisos) de su dominio de protección. Por lo tanto, si su código tiene suficientes derechos solo entonces podría ejecutar esas operaciones.

Si entiendo AccessController.doPrivileged correctamente, está diciendo que el código que no es de confianza debería poder invocar métodos que requieren permisos (como System.getProperty() ) a través de un método intermedio que tiene permisos.

Eso hace surgir la pregunta: ¿cuándo se debe usar AccessController.doPrivileged() ? ¿Cuándo se debe permitir que el código que no es de confianza invoque código privilegiado a través de métodos intermedios? ¿Cuándo debería fallar?

Siguiendo su razonamiento, explique por qué siempre se debe permitir la creación de ClassLoader: http://findbugs.sourceforge.net/bugDescriptions.html#DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED


Básicamente, AccessController.doPriviledged () es el equivalente de un archivo set-user-id. Está diciendo "Por este medio solicito que este método se haga con mis privilegios, incluso si fui invocado por un método que no los tiene".


Echa un vistazo a estos enlaces y desplázate hacia abajo para usar la API doPrivileged.

Java 6: http://docs.oracle.com/javase/6/docs/technotes/guides/security/doprivileged.html

Java 7: http://docs.oracle.com/javase/7/docs/technotes/guides/security/doprivileged.html

Cuando el llamador más reciente invoca el método AccessController checkPermission, el algoritmo básico para decidir si se permite o no el acceso solicitado es el siguiente:

Si el código para cualquier persona que llama en la cadena de llamada no tiene el permiso solicitado, se lanza AccessControlException, a menos que lo siguiente sea verdadero: una persona que llama cuyo código tiene concedido dicho permiso ha sido marcado como "privilegiado" (ver más abajo) y todas las partes posteriormente llamado por este llamante (directa o indirectamente) todos tienen dicho permiso


Estoy de acuerdo con la respuesta de Suraj , pero pensé que agregaría un ejemplo específico donde he requerido el uso de un bloque privilegiado.

Imagine que ha creado una aplicación que proporciona una serie de servicios para módulos conectables. Entonces, su aplicación y sus servicios son códigos confiables. Sin embargo, los módulos conectables no son necesariamente de confianza y se cargan en sus propios cargadores de clase (y tienen sus propios dominios de protección).

Cuando un módulo conectable invoca un servicio, está implementando comprobaciones de seguridad personalizadas ("el módulo X conectable tiene permiso para usar este servicio"). Pero el servicio en sí podría requerir algún permiso básico de Java (leer una propiedad del sistema, escribir en un archivo, etc.). El código que requiere estos permisos está envuelto en un doPrivileged() para que los permisos insuficientes de los módulos enchufables no confiables se ignoren de manera efectiva: solo se aplican los privilegios de su módulo de servicios de confianza.