¿Cómo puedo saber qué versión de Log4J estoy usando?

6 minutos de lectura

avatar de usuario de markthegrea
marca la grea

Como todos sabemos, al menos cuatro o cinco archivos JAR Log4j terminan en el classpath. ¿Cómo puedo saber qué versión estoy usando?

Avatar de usuario de Thomas Tempelmann
Tomas Tempelmann

Vine aquí después de enterarme de que mis servidores pueden ser vulnerables al nuevo exploit Log4j (CVE-2021-44228). Así que necesitaba saber si tenía instalada una compilación desactualizada/vulnerable de Log4j versión 2.

Las respuestas anteriores aquí no ayudan a detectar versiones antiguas, porque son para permitir que el código Java que ya se está ejecutando descubra qué versión de Log4j usa ese código, mientras que necesito saber si cualquier La aplicación Java podría estar usando una versión vulnerable.

Esto es lo que hice en su lugar:

sudo find / -name 'log4j*'

Esto enumera todos los archivos relacionados con Log4j en mi servidor (Linux). Eso me mostró algunas versiones 1.x, que no son vulnerables a este CVE específico, y un archivo 2.15.0, que ya contiene la solución para el CVE.

Si ejecuta esto y encuentra nombres de archivos o carpetas que tienen 2.x, donde x

Precaución

Me advirtieron que esto no es una prueba suficiente para mi propósito porque los archivos Log4j pueden estar ocultos dentro de un archivo .jar, que el find el comando no lo descubriría.

Actualizar

Aquí hay un proyecto público que intenta escanear todos los archivos .jar, para encontrar también el código Log4j dentro de los archivos: Log4-detector

  • Para enumerar todos los archivos JAR en su sistema que contienen el archivo de clase vulnerable (incluso en archivos JAR pesados), puede usar: for f in $(find / -name '*.jar' 2>/dev/null); do echo "Checking $f..."; unzip -l "$f" | grep -F org/apache/logging/log4j/core/lookup/JndiLookup.class; done

    – Deltas

    13 de diciembre de 2021 a las 10:55


  • Tenga en cuenta que Log4j v1 también puede verse afectado: nvd.nist.gov/vuln/detail/CVE-2019-17571

    – Ma Kobi

    13 de diciembre de 2021 a las 13:13

  • Log4j 1.x tiene otras vulnerabilidades. stackoverflow.com/a/70405229/1329426.

    – Jool

    18 de diciembre de 2021 a las 16:44

  • @Delthas ¿Está seguro de que buscar la presencia de JndiLookup.class es una verificación correcta? Las versiones más nuevas (corregidas) de log4j2 aún incluyen ese archivo, aunque con el error eliminado

    – golimar

    22 de marzo de 2022 a las 13:34

  • @golimar De hecho, los archivos que se repararon también se enumerarán. El comando que publiqué lo ayudará a encontrar JAR que son potencialmente vulnerables, pero no le dirá si usan la versión parcheada de Log4j o una vulnerable.

    – Deltas

    22 de marzo de 2022 a las 22:03

Avatar de usuario de Loic Mouchard
Loïc Mouchard

Depende del ClassLoader, pero eche un vistazo a el ejemplo:

import org.apache.log4j.Layout;

public class X {
    public static void main(String[] a) {
        Package p = Layout.class.getPackage();
        System.out.println(p);
        System.out.println("Implementation title:   " + p.getImplementationTitle());
        System.out.println("Implementation vendor:  " + p.getImplementationVendor());
        System.out.println("Implementation version: " + p.getImplementationVersion());
    }
}

Puedes llamar al método getImplementationVersion sobre el Layout clase de log4j:

org.apache.log4j.Layout.class.getPackage().getImplementationVersion()

  • Gran respuesta y tal vez correcta, pero obtengo todos los valores nulos para esa clase. La documentación proporcionada por usted dice que funciona con 1.2 y 1.3. Eso podría significar que estoy usando la versión 2.

    – marca la grea

    25 mayo 2016 a las 13:54


  • Descargué una versión más reciente de Log4j (2.13.1) y encontró que el getImplementationVersion & getSpecificationVersion los métodos funcionan con él. Para versiones anteriores, vea mi respuesta a continuación.

    – AntumDeluge

    19 de abril de 2020 a las 0:04


  • El enlace dado en la respuesta está roto. ¿Alguien puede compartir el código de ejemplo para imprimir la versión log4j mediante programación?

    – Venkatesan Muniappan

    13 de diciembre de 2021 a las 16:43

Avatar de usuario de AntumDeluge
Diluvio Antum

No esperaría que este fuera el método preferido, pero así es como determiné la versión de Log4j que estaba usando mi software:

Abra o extraiga el contenido de Log4j .jar usando una utilidad de archivo .zip (Explorador de Windows apoya esto). Navegue hasta el “META-INF” subdirectorio y abra el archivo “MANIFIESTO.MF” en un editor de texto. Busque la línea que comienza con “Versión de implementación“, esta es la versión de Log4j.

Obviamente, esta no es una solución programática. Pero si simplemente quiere saber qué versión está usando y tiene el archivo .jar, funciona.

Me di cuenta que Package.getSpecificationVersion() y Package.getImplementationVersion(), como se menciona en la respuesta de Loic M., funciona para otras bibliotecas .jar, pero no para mi Log4j. Es posible que la versión que estoy usando simplemente no lo admita.

descargué la versión 2.13.1 para probar los métodos mencionados anteriormente y descubrió que funcionan con él. Entonces fue mi versión (1.2.16) la que no los admitió y regresó null.

Avatar de usuario de Bünyamin Şentürk
Bünyamin Şentürk

He escrito un pequeño script Bash para verificar las versiones de cada archivo JAR de Log4j ubicado en ese servidor. Lee la información de la versión del archivo de manifiesto, ya que confiar en los nombres de los archivos es un poco arriesgado.

locs=( $(sudo find / -name 'log4j*'|grep jar) )
fcount=${#locs[@]}

echo "Found $fcount jar files"
echo " "

for (( j=0; j<${fcount}; j++ ));
do
    unzip ${locs[$j]} META-INF/MANIFEST.MF
    mv META-INF/MANIFEST.MF META-INF/MANIFEST$j.MF
done

echo " "
for (( j=0; j<${fcount}; j++ ));
do
    echo ${locs[$j]}
    tail -2 META-INF/MANIFEST$j.MF
done

Avatar de usuario de Amol Limaye
Amol Limaye

  1. Debido a que hay varias versiones de las mismas clases de diferentes dependencias de Log4j, cualquiera de ellas podría cargarse durante el tiempo de ejecución (dado que el mismo nombre de clase está presente en diferentes archivos JAR).

  2. Uso complementos proporcionados por Eclipse y IDEA IntelliJ ver el Experto árbol de dependencia Luego excluyo los más antiguos para tener solo la versión necesaria de Log4j.

Avatar de usuario de Peter Mortensen
Pedro Mortensen

Para conocer la versión de Log4j durante tiempo de ejecución en Java:

LOGGER.info("Log4j version: " + org.apache.logging.log4j.util.PropertiesUtil.class.getPackage().getImplementationVersion());

O

System.out.println("Log4j version: " + org.apache.logging.log4j.util.PropertiesUtil.class.getPackage().getImplementationVersion());

Avatar de usuario de Peter Mortensen
Pedro Mortensen

Borra todos los archivos JAR de las versiones que no necesites (uno debería ser suficiente) y para averiguar la versión del que queda, mira el nombre del archivo.

Por ejemplo:

log4j-1.2.17.jar

¿Ha sido útil esta solución?