Log4Shell: Apache Log4j 2 CVE-2021-44228

Si no has estado viviendo debajo de una piedra las últimas horas, sabrás que el viernes pasado comenzó a hacerse viral una vulnerabilidad crítica del paquete Log4j 2, una librería de log de Java utilizada masivamente.

Esta vulnerabilidad, bautizada como Log4Shell y descubierta por Chen Zhaojun (ingeniero de software de Alibaba), ha sido asignada el CVE CVE-2021-4428, con un CVSS de 10.0.

Aunque a estas alturas hay toneladas de información pública al respecto, vamos a dar algunas pinceladas sobre ella.

Los actores

Log4j 2: el plugin Lookup

Como hemos comentado, Log4j 2 es una librería de log para aplicaciones Java utilizada por los desarrolladores para loguear información de la aplicación. Utilizarla es tan sencillo como incluir algo como log.debug(“Mensaje de prueba”); en el código, lo que generará que se registre una entrada en el log. A menudo, la información que se registra está relacionada con la propia aplicación y su contexto de ejecución.

Una de las capacidades de la librería, denominada Lookups, es la posibilidad de utilizar variables al escribir en el log, que serán sustituidas por el valor correspondiente, con una sintaxis específica: ${variable}. Por ejemplo, si utilizamos ${java:runtime}, cuando la aplicación grabe en el log, registrará la version del Java runtime.

[Read more…]

Deserializando objetos Java sin los .class

En una auditoría que llevamos a cabo recientemente, surgió la necesidad de inspeccionar el contenido de ciertos ficheros en formato binario, que a todas luces se trataba de objetos Java serializados:

$ file serialized.bin 
serialized.bin: Java serialization data, version 5

En efecto, los dos primeros bytes eran el magic number de este tipo de ficheros:

0000000 edac 0500 ...
0000010 ...
0000020 ...
0000030 ...
0000040 ...

pero los objetos serializados debían ser relativamente complejos, por lo que un mero strings sobre el fichero no nos ayudaba a “descifrar” la información.

[Read more…]