我用一个 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 许可协议
CVE-2021-44228 Log4Shell 漏洞
如果可以,按照 Apache 日志站点 上安全细节的建议升级到 Log4j2 + Java 版本。自从我原来的帖子以来,这个网站已经改变了;始终遵循 Apache 网站推荐的指南。
Apache 站点之前针对针对早期版本的 Log4j2 报告的 JNDI 查找漏洞提出了一些解决方法。
IMO:这是一个非常严重的漏洞,您不应该考虑这些解决方法,并且在您阅读本文时它们可能无济于事。升级 Log4j JAR 文件并查看下面关于要检查的地方的注释。
log4j2.formatMsgNoLookups
传递为java -Dlog4j2.formatMsgNoLookups=true ...
。LOG4J_FORMAT_MSG_NO_LOOKUPS
设置为 true。org/apache/logging/log4j/core/lookup/JndiLookup.class
- 请参阅log4j-core-*.jar
。%m
替换为%m{nolookups}
在
grep
的 Java 源代码上运行LOG4J_FORMAT_MSG_NO_LOOKUPS
2.14.0
,所以它是否有帮助完全不清楚。某些 JDK 版本降低了风险:高于 6u211、7u201、8u191 和 11.0.1 的 JDK 不受影响,因为默认应用于 LDAP 查找。尽可能升级。
一些检查 Log4j 使用的地方
检查您使用的 Java 版本是否足够新:
扫描您的应用程序发布结构、应用程序服务器、开发环境以查找可能的 Log4j 旧版本:
如果您不确定您在 ZIP 工具中打开 JAR 文件并查看
META-INF\MANIFEST.MF
的 Log4j 版本,可能有一行包含版本的详细信息:查看每台发布机器上的运行进程,看看是否有任何打开的 Log4j JAR 文件的文件句柄:
同时扫描机器以验证 Java VM 是否是您期望的版本。这可能会发现更多需要处理的应用程序:
扫描应用程序服务器上的 EAR 和 WAR 存档以验证容器存档中没有任何嵌入式 Log4j JAR 文件。您可以使用
find
和unzip
命令来执行此操作,或者尝试使用ShowClassVersions
类来检测 此答案 中的 Java 编译器版本。这将打印出 WAR 和 EAR 文件中的 JAR 文件的名称: