Estoy tratando de comprender el modelo de seguridad utilizado cuando se le pide a la JVM que cargue las clases.El modelo de seguridad de Java ClassLoader
A partir de la especificación de JVM en Sandboxing, tengo la creencia de que una implementación de JVM estándar debe mantener al menos otra ClassLoader
, independiente de primordial ClassLoader
. Esto se usa para cargar los archivos de la clase de aplicación (desde una ruta de clase proporcionada, por ejemplo).
Si se solicita la clase de la ClassLoader
que no está en su espacio de nombres, java/lang/String
por ejemplo, a continuación, reenvía la solicitud al primordial ClassLoader
, que intenta cargar la clase de la API de Java, si no está allí, entonces arroja un NoClassDefFoundError
.
¿Estoy en lo cierto al pensar que el ClassLoader
primordial solo carga las clases desde el espacio de nombres de la API Java, y todas las demás clases se cargan a través de una implementación ClassLoader
independiente?
Y que esto hace que la carga de las clases más seguros, ya que significa que una clase malicioso no puede hacerse pasar por un miembro de la API de Java (digamos que java/lang/Virus
) porque se trata de un espacio de nombres protegidos, y no puede ser utilizado en la corriente ClassLoader
?
¿Pero hay algo para evitar que las clases de la API de Java sean reemplazadas por clases maliciosas, o se detectaría durante la verificación class
?
Básicamente correcto. El ClassLoader "primordial" se conoce como el "Cargador de clases de arranque" y carga clases desde el "classpath de arranque". La protección ofrecida por este es razonablemente "fuerte" siempre que el "oficial de seguridad" controle la invocación de JVM (por ejemplo, línea de comando) donde se especifica el classpath de arranque. –
(Algunas JVM tienen seguridad adicional en la ruta de clase de arranque, lo que requiere que los JAR tengan un atributo privilegiado). –
@HotLicks ¿El 'boot classpath' es el lugar donde se encuentra el tiempo de ejecución de Java? – Jivings