Configuro mi Log4j con un archivo XML. ¿Dónde debo agregar formatMsgNoLookups=true ?
<?xml version="1.0" encoding="UTF-8"?> <!-- Upload files compare config --> <configuration status="OFF"> <appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss} %p - %msg%n"/> </Console> <!-- http://logging.apache.org/log4j/2.x/manual/appenders.html#RollingFileAppender --> <RollingFile name="File" fileName="logs/MyLogFile.log" filePattern="logs/MyLogFile-%d{yyyy-MM-dd}.log" ignoreExceptions="false"> <PatternLayout> <Pattern>%d %p %c{1.} %m%n</Pattern> </PatternLayout> </RollingFile> </appenders> <Loggers> <Root level="INFO"> <AppenderRef ref="File"/> <AppenderRef ref="Console"/> </Root> </Loggers> </configuration>Como comentó DuncG , la opción de deshabilitar las búsquedas para Log4j no es una opción de configuración sino una propiedad del sistema.
log4j2.formatMsgNoLookupsDependiendo de su entorno ( Spring , ejecutable independiente, aplicación web Tomcat ,...) la forma en que se establecen las propiedades del sistema puede variar. La posibilidad más sencilla de iniciar un proceso Java desde un archivo JAR sería agregar
-Dlog4j2.formatMsgNoLookups=truea su línea de comando:
java -Dlog4j2.formatMsgNoLookups=true -jar myapp.jarCVE-2021-44228 Vulnerabilidad Log4Shell
Si puede, actualice a las versiones Log4j2 + Java según lo recomendado por los detalles de seguridad en el sitio de registro de Apache . Este sitio ha cambiado desde mi publicación original; Siempre siga las pautas recomendadas del sitio web de Apache.
El sitio de Apache sugirió anteriormente algunas soluciones para la vulnerabilidad de búsqueda JNDI informada en versiones anteriores de Log4j2.
En mi opinión: esta es una vulnerabilidad tan grave que no debe contemplar estas soluciones alternativas y, para cuando lea esto, es posible que ya no le ayuden. Actualice los archivos JAR de Log4j y vea la nota a continuación sobre los lugares para verificar.
log4j2.formatMsgNoLookups cuando inicie la VM, pasando como java -Dlog4j2.formatMsgNoLookups=true ... .LOG4J_FORMAT_MSG_NO_LOOKUPS en verdadero.org/apache/logging/log4j/core/lookup/JndiLookup.class de classpath; consulte log4j-core-*.jar .%m por %m{nolookups} para algunas versiones No pude encontrar LOG4J_FORMAT_MSG_NO_LOOKUPS al ejecutar un grep en el código fuente de Java para 2.14.0 , por lo que no está claro si esto ayuda en absoluto.
Ciertas versiones de JDK mitigan los riesgos: JDK superiores a 6u211, 7u201, 8u191 y 11.0.1 no se ven afectados debido a los valores predeterminados aplicados a las búsquedas LDAP. Actualizar donde sea posible.
Algunos lugares para verificar el uso de Log4j
Compruebe qué versiones de Java utiliza son lo suficientemente recientes:
java -versionEscanee las estructuras de lanzamiento de su aplicación, los servidores de aplicaciones y los entornos de desarrollo en busca de posibles versiones antiguas de Log4j:
find yourReleaseDir -type f -name log4j\*jar Si no está seguro de qué versión de Log4j tiene, abra el archivo JAR en una herramienta ZIP y vea META-INF\MANIFEST.MF ; puede haber una línea con los detalles de la versión:
Log4jReleaseVersion: ABCVea los procesos en ejecución en cada máquina de lanzamiento para ver si hay algún identificador de archivo abierto para los archivos JAR de Log4j:
lsof | grep log4jTambién escanee las máquinas para verificar que la VM de Java sean las versiones que espera. Esto puede detectar más aplicaciones en las que trabajar:
ps -ef | egrep "(java|jdk)" #OR: | grep -v grep Escanee archivos EAR y WAR en servidores de aplicaciones para verificar que no haya ningún archivo JAR de Log4j incrustado dentro de un archivo contenedor. Puede hacer esto con los comandos de find y unzip , o pruebe la clase ShowClassVersions que escribí para detectar las versiones del compilador de Java en esta respuesta . Esto imprimiría los nombres de los archivos JAR dentro de los archivos WAR y EAR :
java ShowClassVersions.java app_server_dir |grep log4j app_server_dir/somewebapp.war => WEB-INF/lib/log4j2-core.jarPuede hacer esto: %m{nolookups} en el diseño.
{nolookups} es cómo establece la propiedad log4j2.formatMsgNoLookups=true dentro del contenido XML de configuración.
Citando de la fuente de Log4j:
FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS = PropertiesUtil.getProperties().getBooleanProperty("log4j2.formatMsgNoLookups", false);
y su javadoc:
LOG4J2-2109 si es verdadero, MessagePatternConverter siempre funcionará como si
%m{nobúsquedas}
está configurado.
Ya que:
2.10
Agregue el delimitador -Dlog4j2.formatMsgNoLookups=true en export catalina_opts o export java_options .
Hay mucha confusión con respecto a la variable a usar, log4j2.formatMsgNoLookups, log4j.formatMsgNoLookups, etc. Tenga en cuenta que como se indica en PropertySource.java ,
/ ** * Converts a property name string into a list of tokens. This will strip a prefix of {@code log4j}, * {@code log4j2}, {@code Log4j}, or {@code org.apache.logging.log4j}, along with separators of * dash {@code -}, dot {@code.}, underscore {@code _}, and slash {@code /}. Tokens can also be separated * by camel case conventions without needing a separator character in between. * * @param value property name * @return the property broken into lower case tokens * /Puede usar diferentes valores para la variable, como puede verificar con este código de prueba (lamentablemente, debe indicar la propiedad del sistema en un bloque estático, por lo que para probar las diferentes opciones, debe comentar o descomentar las diferentes líneas del examen).
package org.apache.logging.log4j.core.pattern; import org.apache.logging.log4j.core.util.Constants; import org.junit.Test; import static org.junit.Assert.assertTrue; / ** * * / public class Log4jParameterTest { static { // Test Ok. All working // System.setProperty ("log4j2.formatMsgNoLookups", "true"); // System.setProperty ("log4j.formatMsgNoLookups", "true"); // System.setProperty ("Log4j.formatMsgNoLookups", "true"); // System.setProperty ("org.apache.logging.log4j.formatMsgNoLookups", "true"); // System.setProperty ("log4j2-formatMsgNoLookups", "true"); // System.setProperty ("log4j2_formatMsgNoLookups", "true"); System.setProperty ("log4j2 / formatMsgNoLookups", "true"); // Test KO. All fail // System.setProperty ("log5j2.formatMsgNoLookups", "true"); // System.setProperty ("log5j2-formatMsgNoLookups", "true"); } @Test public void testLookupEnabledByDefault () { assertTrue ("Lookups deactivated", Constants.FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS); } }A quién usa log4j-xml-config-file :
%m por %m{nolookups} en PatternLayoutSystem.setProperty("log4j2.formatMsgNoLookups", "true");