将 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 文件。您可以使用find
和unzip
命令来执行此操作,或者尝试我编写的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 <image> 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_opts
或export 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 配置文件的啥位置的主要内容,如果未能解决你的问题,请参考以下文章