将 formatMsgNoLookups 放在 Log4j XML 配置文件中的位置

2022-08-31 22:32:06

我用XML文件配置我的Log4j。我应该在哪里添加格式MsgNoLookups=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>

答案 1

CVE-2021-44228 Log4Shell 漏洞

如果可以,请按照 Apache 日志记录站点上的安全详细信息的建议升级到 Log4j2 + Java 版本。自从我最初的帖子以来,这个网站已经改变了;始终遵循 Apache 网站上推荐的准则。

Apache 站点之前针对针对早期版本的 Log4j2 报告的 JNDI 查找漏洞提出了一些解决方法。

IMO:这是一个非常严重的漏洞,你不应该考虑这些解决方法,当你读到这篇文章时,它们可能无论如何都没有帮助。升级Log4j JAR文件,并查看下面有关检查位置的说明。

  1. 启动 VM 时设置系统属性,并作为 传递。log4j2.formatMsgNoLookupsjava -Dlog4j2.formatMsgNoLookups=true ...
  2. 将环境变量设置为 true。LOG4J_FORMAT_MSG_NO_LOOKUPS
  3. 对于从 2.0-beta9 到 2.10.0 的版本,缓解措施是从类路径中删除 - 请参见。org/apache/logging/log4j/core/lookup/JndiLookup.classlog4j-core-*.jar
  4. 将格式模式替换为 某些版本%m%m{nolookups}

在 Java 源代码上运行时,我找不到 ,所以不清楚这是否有帮助。LOG4J_FORMAT_MSG_NO_LOOKUPSgrep2.14.0

某些 JDK 版本可降低风险:大于 6u211、7u201、8u191 和 11.0.1 的 JDK 不会因应用于 LDAP 查找的默认值而受到影响。尽可能升级。

检查Log4j使用的一些地方

检查您使用的 Java 版本足够新:

java -version

扫描您的应用程序发布结构,应用程序服务器,开发环境,以查找可能的旧版本的Log4j:

find yourReleaseDir -type f -name log4j\*jar

如果您不确定在ZIP工具和视图中打开JAR文件的Log4j版本 - 可能会有一行包含版本的详细信息:META-INF\MANIFEST.MF

 Log4jReleaseVersion: A.B.C

查看每台发布计算机上正在运行的进程,以查看 Log4j JAR 文件是否有任何打开的文件句柄:

lsof | grep log4j

还要扫描计算机以验证 Java VM 是否为预期的版本。这可能会发现更多要处理的应用程序:

ps -ef | egrep "(java|jdk)"    #OR: | grep -v grep

扫描应用程序服务器上的 EAR 和 WAR 存档,以验证容器存档中没有任何嵌入式 Log4j JAR 文件。您可以使用 和 命令 执行此操作,或者尝试我编写的类来检测此答案中的 Java 编译器版本。这将在 WAREAR 文件中打印出 JAR 文件的名称:findunzipShowClassVersions

java ShowClassVersions.java app_server_dir |grep log4j
app_server_dir/somewebapp.war => WEB-INF/lib/log4j2-core.jar

答案 2

正如DuncG所评论的那样,禁用Log4j查找的选项不是配置选项,而是系统属性

log4j2.formatMsgNoLookups

根据您的环境(Spring,独立可执行文件,Tomcat Web应用程序,...),系统属性的设置方式可能会有所不同。从 JAR 文件启动 Java 进程的最简单方法是添加

-Dlog4j2.formatMsgNoLookups=true

到命令行:

java -Dlog4j2.formatMsgNoLookups=true -jar myapp.jar

推荐