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?
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
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
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
.
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
Amol Limaye
-
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).
-
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.
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());
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