在Log4j XML配置文件中放置格式MsgNoLookup的位置

2022-04-12 00:00:00 java log4j2

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

<推荐答案-2021-44228 Log4外壳漏洞

如果可以,请按照Apache logging site上的安全详情建议升级到Log4j2+Java版本。与我最初的帖子相比,此站点已更改;请始终遵循来自阿帕奇网站的建议指南。

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

IMO:这是一个非常严重的漏洞,您不应该考虑这些解决方法,当您阅读本文时,它们可能也帮不上什么忙。升级Log4j JAR文件,并查看下面有关检查位置的说明。

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

2.14.0的Java源代码上运行grep时找不到LOG4J_FORMAT_MSG_NO_LOOKUPS,因此不清楚这是否有帮助。

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

使用Log4j检查的一些地方

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

java -version

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

find yourReleaseDir -type f -name log4j*jar

如果您不确定您使用的是哪个Log4j版本,请在ZIP工具中打开JAR文件并查看META-INFMANIFEST.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文件。您可以使用findunzip命令来执行此操作,或者尝试使用我编写的ShowClassVersions类来检测this answer中的Java编译器版本。这将打印出WAR和EAR文件中的JAR文件的名称:

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

相关文章