Ya es materia conocida la nueva vulnerabilidad 0-day de Java. Tal cómo indicamos en nuestro post anterior titulado “Alerta: exploit 0 day afecta Java y propaga malware”, esta vulnerabilidad afecta a todos aquellos usuarios que posean la versión 7.x de Java. Asimismo, ya existe en circulación malware que aprovecha esta vulnerabilidad y permite infectar a aquellos usuarios que ingresen a un sitio web con un applet malicioso.
Desde el laboratorio de ESET Latinoamérica se realizó un análisis sobre el mencionado exploit y a partir de este estudio es importante destacar algunos aspectos para entender su funcionamiento. Los applets generalmente se ejecutan en el entorno de un sitio web y proveen funcionalidades diferentes, agregando en muchos casos, dinamismo al sitio web. El código de un applet en un sitio web es como el siguiente:
Tal cómo puede observarse en la captura anterior, el código html del sitio web carga un archivo jar, que en el ejemplo responde al nombre de Exploit.jar, el cual se ejecuta en el entorno del applet. Cabe destacar que aquí es donde yace la vulnerabilidad. Java permite la ejecución de códigos del tipo applet pero lo hace con permisos muy restringidos. Esta vulnerabilidad, en términos generales, permite elevar el nivel de permisos y ejecutar código arbitrario sobre el sistema de la víctima. De esa forma, si el usuario ingresa a un sitio web que contiene un applet malicioso, su sistema puede ser comprometido. Vale aclarar que la carga del applet es totalmente legítima, es el propio archivo jar el que manipula la máquina virtual de Java y salta las protecciones correspondientes para ejecutar el código arbitrario.
Continuando con el análisis, se comprobó cómo se aprovechaba de la vulnerabilidad. Curiosamente, la explotación es sumamente silenciosa, es decir, ni siquiera se visualiza el cuadro de diálogo que solicita la autorización del usuario para ejecutar el código del applet. De esta forma, los ciberdelincuentes cargan el código del applet de un tamaño no visible, es decir, 1 pixel de alto por 1 pixel de ancho para que la potencial víctima no sospeche nada al visitar el sitio web malicioso.
¿Dónde reside la vulnerabilidad?
Si continuamos con el análisis, se puede observar que existe un método SetField() que permite cambiar el contenido de un campo de un objeto. Tal como se ve en la captura anterior, el exploit establece todos los permisos y mediante el método SetField() modifica el campo "acc" asignándole un objeto del tipo AccessControlContext con los permisos definidos anteriormente. En teoría esto no debería poder ejecutarse, sin embargo se utiliza otro método denominado GetClass() el cual permite obtener el campo "acc" antes mencionado a partir del método getField() de la clase sun.awt.Suntoolkit. Una vez que este campo es accesible, el método setField() lo modifica. Cabe aclarar que los objetos pertenecientes a sun.* no pueden ser accesibles desde un applet. Para evadir esta protección, se utiliza un segundo método que responde al nombre de GetClass(). Este método realiza una llamada a forName para poder acceder al objeto y saltar la mencionada restricción. A continuación puede visualizarse los métodos a partir del código del exploit desensamblado:
Para aquellos usuarios que posean instalado la versión de Java 7 en cualquiera de sus actualizaciones, es recomendable desactivar esta característica. En nuestro post titulado ¿Cómo desactivar Java del navegador? se indican las instrucciones para realizarlo en cada uno de los navegadores. Asimismo, es importante contar con una solución antivirus con capacidad de detección proactiva que permita estar protegidos contra la descarga y ejecución de los códigos maliciosos que puedan ser utilizados al explotar esta vulnerabilidad.
Fernando Catoira
Analista de Seguridad