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

Posted

技术标签:

【中文标题】将 formatMsgNoLookups 放在 Log4j XML 配置文件的啥位置【英文标题】:Where to put formatMsgNoLookups in the Log4j XML configuration file将 formatMsgNoLookups 放在 Log4j XML 配置文件的什么位置 【发布时间】:2022-01-15 19:23:36 【问题描述】:

我使用 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="%dHH: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-%dyyyy-MM-dd.log"
                 ignoreExceptions="false">
      <PatternLayout>
        <Pattern>%d %p %c1. %m%n</Pattern>
      </PatternLayout>
    </RollingFile>
  </appenders>
  <Loggers>
    <Root level="INFO">
      <AppenderRef ref="File"/>
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</configuration>

【问题讨论】:

一种方法是使用系统属性 - 请参阅 java -Dlog4j2.formatMsgNoLookups=true ... 或其他建议是删除 JndiLookup.class 【参考方案1】:

CVE-2021-44228 Log4Shell 漏洞

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

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

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

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

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

如果您不确定使用 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 类来检测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

【讨论】:

OP 正在询问,我也想知道是否可以在 log4j2.xml 文件中的某处设置formatMsgNoLookups=true。如果是这样,在哪里以及如何? 是的,我在上面提到过 %mnolookups 并查看 @Mj.B 的回答(注意:我无法测试,因为不受这个可怕的 log4j 问题的影响) 我会在这个答案中补充一点,如果您使用的是Jib,那么您可以使用docker run --rm -it --entrypoint grep &lt;image&gt; log4j app/libs -r检查您拥有的库版本 如果应用程序使用 Windows 注册表将参数作为字符串输入会怎样?是否可以在此处添加一个行项目,用于命名字符串以及它的值应该是什么,例如? 只有第一个解决方法适用于命令行参数,如果您使用正确的 log4j2 版本,则在类名之前将 -Dlog4j2.formatMsgNoLookups=true 添加到 java 命令应该触发该解决方法。但是,为什么要冒险在您的机器上安装 jar 或添加不使用该解决方法的新依赖项/应用程序?【参考方案2】:

作为DuncG commented,禁用Log4j 查找的选项不是配置选项,而是系统属性

log4j2.formatMsgNoLookups

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

-Dlog4j2.formatMsgNoLookups=true

到你的命令行:

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

【讨论】:

OP 正在询问,我也想知道是否可以在 log4j2.xml 文件中的某处设置formatMsgNoLookups=true。如果是这样,在哪里以及如何? @AndyLester 在 log4j.xml 配置中禁用查找的选项将在每个模式中使用 %mnolookups 而不仅仅是 %m。由于没有选项可以通过单个开关禁用对所有模式的查找,因此此选项容易出错(如果没有此参数,模式可能会丢失或稍后添加)。因此,这不是推荐的方法。 因此,“如果可以在 log4j2.xml 文件中的某处设置formatMsgNoLookups=true”的答案是“不,不是。” @AndyLester 完全正确。我认为“禁用 log4j 查找的选项不是配置选项”这句话会说明这一点。 由于 Log4j 2.x 从至少三个来源(参见documentation)读取属性,因此也可以将设置放入应用程序类路径中的log4j2.component.properties 文件中。【参考方案3】:

您可以这样做:%mnolookups 在布局中。

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

引自 Log4j 源代码:

public static final boolean FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS = PropertiesUtil.getProperties().getBooleanProperty("log4j2.formatMsgNoLookups", 假);

及其javadoc:

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

%mnolookups

已配置。

自:

2.10

【讨论】:

【参考方案4】:

export catalina_optsexport java_options 下添加分隔符-Dlog4j2.formatMsgNoLookups=true

【讨论】:

【参考方案5】:

请记住始终从下面列出的资源中查看最新信息。

CVE-2021-45105... 2.16.0 和 2.12.2 不再是有效的补救措施!当前的修复版本是 2.17.0 (Java 8) 和 2.12.3 (Java 7)。所有其他 Java 版本都必须采取权宜之计(从 log4j-core JAR 中删除/删除 JndiLookup.class 文件。


环境变量选项不再被视为有效的补救或缓解措施。从技术上讲,它会稍微减少漏洞的暴露,但实际上不会修复任何问题。我在下面概述了补救信息。

更多资源 Log4j 0day being exploited 这个有 有用信息,包括检测器、更多资源链接、非常容易理解的补救步骤等等 Apache Log4j Vulnerability Guidance CISA Log4j (CVE-2021-44228) Vulnerability Guidance Apache Log4j Security Vulnerabilities

补救措施:

CVE-2021-45046 ... CVE-2021-44228 ... CVE-2021-45105

遵循这些资源中的指导......它可能会改变,但是

截至 2021 年 12 月 18 日

基本上是

尽可能删除 log4j-core JAR 文件 从两台正在运行的机器中立即修复 在您的源代码/源代码管理文件中,以防止未来的构建/发布/部署覆盖更改 如果这不可能(由于依赖),请升级它们 如果您运行的是 Java 8,则可以升级到 Log4j 2.17.0+ 如果您运行的是 Java 7,则可以升级到 Log4j 2.12.3 如果您运行的是旧版 Java,则需要升级到最新版 Java,然后使用最新版 Log4J 同样,这些更改必须同时发生在正在运行的机器和代码中 如果由于某种原因这两种方法都不可能......那么从 log4j-core 中删除 JndiLookup.class 文件存在 -补救停止间隙JAR 文件。 在 Linux 上使用zip 命令提供了一种止损选项,默认情况下,该命令与大多数 Linux 发行版一起打包。 zip -q -d "$LOG4J_JAR_PATH" org/apache/logging/log4j/core/lookup/JndiLookup.class 在撰写本文时,大多数 Windows 上的止损选项在线指南都说要执行以下操作(再次...假设您无法执行上述删除 JAR 或升级选项之一): 安装类似7-Zip 找到所有 log4j-core JAR 文件,并为每个文件执行以下操作... 重命名 JAR 以将扩展名更改为 .zip 使用 7-Zip 解压缩 JAR 文件(现在扩展名为 .zip) 从解压缩的文件夹中找到并删除 JndiLookup.class 文件 路径是\\path\\to\\unzippedFolder\\org\\apache\\logging\\log4j\\core\\lookup\\JndiLookup.class 删除旧的 JAR 文件(现在扩展名为 .zip) 使用 7-Zip 重新-压缩文件夹 重命名新的 .zip 文件夹以将扩展名更改为 .jar 还有一些使用 PowerShell 的选项 Reddit thread: log4j_0day_being_exploited Ctrl + F 用于“PowerShell”

如果您只有一个或两个 JAR 文件要处理,并且您不介意安装 7-Zip 或者您有 PowerShell 可用,这很好。但是,如果您有很多 JAR 文件,或者您不想安装 7-Zip 并且无权访问 PowerShell,我创建了一个开源 VBScript 脚本 (.vbs)您无需安装任何其他软件。 Windowslog4jClassRemover

阅读自述文件和发行说明 - Release: The light is really easy to read & follow now CrazyKidJack/Windowslog4jClassRemover

【讨论】:

我认为我的回答很明确:“你不应该考虑这些变通办法”,尤其是因为源代码甚至不匹配。 @DuncG 2.15 版不再是有效的补救措施。请将您的答案更新为 Java 8 的 2.16.0 和 Java 7 的 2.12.2。由于补救建议经常更改,我建议您还包括指向第 3 方安全信息位置的链接。如果您进行了这些修改,我很乐意删除我的“警告”消息。我还更新了我的答案,以更准确地反映您的答案的问题 我已修改,希望对您有所帮助。 @DuncG 太棒了:) 谢谢!我也修改了答案 嗨!我不熟悉那个库,但我认为我们可以在主程序文件的源代码中添加路径:\\path\\to\\unzippedFolder\\org\\apache\\logging\\log4j\\core\\查找\\JndiLookup.java 。并且只是在该文件中存根错误代码。 JVM 将首先在源中搜索类。它会比任何参数都更严格,不是吗?【参考方案6】:

关于要使用的变量、log4j2.formatMsgNoLookups、log4j.formatMsgNoLookups 等存在很多混淆。请记住,如 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
* /

你可以为变量使用不同的值,因为你可以用这个测试代码检查(不幸的是,你必须在静态块中指出系统的属性,所以要测试不同的选项,你必须注释或取消注释测试的不同行)。

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);

    

【讨论】:

【参考方案7】:

谁使用log4j-xml-config-file

    在 PatternLayout 中将 %m 替换为 %mnolookups 添加系统属性 log4j.formatMsgNoLookups = true:System.setProperty("log4j2.formatMsgNoLookups", "true");

【讨论】:

什么是“log4j-xml-config-file”?一份文件?一袋?还有什么? @PeterMortensen:应该是 log4j2.xml 或 log4j.xml 配置文件。我只想提一下“Log4j XML 配置文件”作为线程标题

以上是关于将 formatMsgNoLookups 放在 Log4j XML 配置文件的啥位置的主要内容,如果未能解决你的问题,请参考以下文章

快速排序

automake 将目标文件放在库之后

把图片放在右边,把文字放在左边

音标中的[l] 放在句首是的发音和句末的发音貌似不一样 怎么会这样呢

python-快速排序

Codeforces Round #452 (Div. 2) C Dividing the numbers