Inyección de Class.forName e invocación del constructor

9

Si una página web basada en Java toma un parámetro suministrado por el usuario y crea una instancia de un objeto utilizando

Class.forName(parameter)
¿Cuál es la peor consecuencia posible?

El atacante obtiene rastros de pila. Una vez que se crea una instancia del objeto, se convierte en una clase propietaria, por lo que lanzará una excepción en ese momento.

Ejemplo de consecuencia:

  • Enumerar clases en classpath

Editar: El atacante también puede especificar cualquier número de cadenas pasadas al constructor.

    
pregunta mhswende 06.06.2012 - 21:47
fuente

2 respuestas

5

Esto deja mucho espacio para el abuso. Básicamente, se puede ejecutar cualquier inicializador estático y cualquier constructor que tenga parámetros de cadena: Esta es una vulnerabilidad común de < algo > (por ejemplo, JSON) a los analizadores de Java, que permiten que el bloque de datos no confiable especifique los nombres de clase.

Los controladores JDBC deben registrarse en el inicializador estático . Se supone que las clases que usan métodos nativos cargan la biblioteca nativa en el bloque de inicio estático. Además, existe un patrón único de creación de la instancia en el bloque estático. Por lo tanto, es posible utilizar memoria, que no puede ser GCed. Y, por supuesto, alguien podría haber escrito código que hace otras cosas extrañas en el bloque de inicio estático.

Hay muchas clases que tienen efectos secundarios en su constructor . Por ejemplo, la creación de una instancia de FileOutputStream con un nombre de archivo como parámetro vaciará ese archivo, asumiendo que el proceso Java tiene permiso de escritura.

Esos ejemplos me vinieron a la mente al leer la publicación. Estoy seguro de que hay mucho más.

Además, debe considerar si es realmente necesario mostrar los Stacktraces al atacante. A menudo es una buena idea entregar la menor cantidad de información posible en situaciones inesperadas . En su situación, por ejemplo, hace una diferencia si FileInputStream lanza una excepción IOException o una excepción ClassCastException. Esta información podría facilitar la explotación de otra vulnerabilidad.

Como mínimo, debe verificar TrustedInterface.class.isAssinableFrom(loadedClass) antes de invocar el constructor o usar loadedClass.asSubclass(TrustedInterface.class) . Pero recomiendo encarecidamente utilizar una lista blanca de nombres de clase.

    
respondido por el Hendrik Brummermann 08.06.2012 - 00:49
fuente
1

Class.forName() por sí mismo no es realmente un sumidero. Esto puede ser una vulnerabilidad, pero depende de cómo se use el objeto class devuelto por esta llamada de método.

El uso de Class.forName() puede llevar a Reflexión insegura en que un atacante puede crear una instancia de clase de su elección y luego invocar una llamada de método en el objeto resultante.

    
respondido por el rook 07.06.2012 - 23:28
fuente

Lea otras preguntas en las etiquetas