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

新手上路,请多包涵

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

原文由 Ben 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 966
2 个回答

CVE-2021-44228 Log4Shell 漏洞

如果可以,按照 Apache 日志站点 上安全细节的建议升级到 Log4j2 + Java 版本。自从我原来的帖子以来,这个网站已经改变了;始终遵循 Apache 网站推荐的指南。

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

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}

grep 的 Java 源代码上运行 LOG4J_FORMAT_MSG_NO_LOOKUPS 2.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 文件并查看 META-INF\MANIFEST.MF 的 Log4j 版本,可能有一行包含版本的详细信息:

  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 类来检测 此答案 中的 Java 编译器版本。这将打印出 WAREAR 文件中的 JAR 文件的名称:

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

原文由 DuncG 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

log4j2.formatMsgNoLookups

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

-Dlog4j2.formatMsgNoLookups=true

到你的命令行:

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

原文由 dpr 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题