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

Ben*_*Ben 51 java log4j2

我使用 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>
Run Code Online (Sandbox Code Playgroud)

Dun*_*ncG 44

CVE-2021-44228 Log4Shell 漏洞

\n

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

\n

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

\n

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

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

在 Java 源代码上LOG4J_FORMAT_MSG_NO_LOOKUPS运行时我找不到,因此 it\xe2\x80\x99s 不清楚这是否有帮助。grep2.14.0

\n

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

\n

检查 Log4j 使用情况的一些地方

\n

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

\n
java -version\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
find yourReleaseDir -type f -name log4j\\*jar\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
 Log4jReleaseVersion: A.B.C\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
lsof | grep log4j\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
ps -ef | egrep "(java|jdk)"    #OR: | grep -v grep\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
java ShowClassVersions.java app_server_dir |grep log4j\napp_server_dir/somewebapp.war => WEB-INF/lib/log4j2-core.jar\n
Run Code Online (Sandbox Code Playgroud)\n


dpr*_*dpr 19

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

\n
log4j2.formatMsgNoLookups\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
-Dlog4j2.formatMsgNoLookups=true\n
Run Code Online (Sandbox Code Playgroud)\n

到你的命令行:

\n
java -Dlog4j2.formatMsgNoLookups=true -jar myapp.jar\n
Run Code Online (Sandbox Code Playgroud)\n

  • @AndyLester 完全正确。我认为“禁用 log4j 查找的选项不是配置选项”这句话正好说明了这一点。 (3认同)
  • @AndyLester 在 log4j.xml 配置中禁用查找的选项将在每个模式中使用 `%m{nolookups}` 而不是仅使用 `%m`。由于没有选项可以通过单个开关禁用所有模式的查找,因此此选项很容易出错(如果没有此参数,可能会丢失或稍后添加模式)。因此,这不是推荐的方法。 (2认同)
  • 由于 Log4j 2.x 至少从三个来源读取属性(参见[文档](https://logging.apache.org/log4j/2.x/manual/configuration.html#SystemProperties)),因此也可以将设置放入应用程序类路径中的“log4j2.component.properties”文件中。 (2认同)

小智 7

您可以这样做:%m{nolookups}在布局中。

{nolookups}log4j2.formatMsgNoLookups=true是您在配置 XML 内容中设置属性的方式。

引用 Log4j 源码:

公共静态最终布尔 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS = PropertiesUtil.getProperties().getBooleanProperty("log4j2.formatMsgNoLookups", false);

及其javadoc:

LOG4J2-2109 如果为 true,MessagePatternConverter 将始终按如下方式运行

%m{无查找}

已配置。

自从:

2.10