Apache Log4j 是一个流行的 Java 日志框架,然而,在近期,Log4j 2.x 版本暴露出了一个严重的安全漏洞(CVE-2021-44228),该漏洞可能导致远程代码执行。在本文中,我们将介绍有关这个漏洞的详细信息以及如何修复它。
CVE-2021-44228 安全漏洞简介
CVE-2021-44228 安全漏洞是由于 Log4j 中的一个 JNDI 注入问题导致的。攻击者可以通过构造恶意请求,触发目标服务器上的 JNDI 服务,从而执行任意代码或获取敏感信息。
此漏洞已在 Log4j 2.15.0 版本中进行修复。因此,如果您正在使用早期版本的 Log4j,请尽快升级到最新版本。
步骤1:检查是否受影响
首先,我们需要确定应用程序是否受到 CVE-2021-44228 安全漏洞的影响。为此,您可以运行下面的命令来检查所使用的 Log4j 版本:
bash复制代码
$ java -jar log4j-core-*.jar
如果您看到以下输出,则表示您的系统存在漏洞:
复制代码
ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
java.lang.ExceptionInInitializerError
at org.apache.logging.log4j.core.lookup.JndiLookup.lookup(JndiLookup.java:45)
at org.apache.logging.log4j.core.config.ConfigurationFactory$Factory.getConfiguration(ConfigurationFactory.java:554)
at org.apache.logging.log4j.core.config.ConfigurationFactory$Factory.getConfiguration(ConfigurationFactory.java:480)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:237)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:47)
at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)
at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getContext(AbstractLoggerAdapter.java:124)
at org.apache.logging.log4j.jul.AbstractLoggerAdapter.getContext(AbstractLoggerAdapter.java:39)
at java.util.logging.Logger.demandLogger(Logger.java:448)
at java.util.logging.Logger.getLogger(Logger.java:502)
at com.example.MyClass.<clinit>(MyClass.java:8)
Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.lookup(Unknown Source)
at org.apache.logging.log4j.core.lookup.JndiLookup.lookup(JndiLookup.java:43)
... 10 more
如果输出是类似于以下内容的,则您的系统已经升级到 Log4j 2.15.0 版本并且不受影响:
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
ERROR StatusLogger Reconfiguration failed: No configuration found for '33b3c801' at 'null' in 'classpath:/log4j2-test.xml'
步骤2:升级 Log4j
如果您确定您的系统存在 CVE-2021-44228 安全漏洞,请立即升级到最新版本的 Log4j。您可以从官方网站(logging.apache.org/log4j/2.x/d…
xml复制代码
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.16.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.16.0</version>
</dependency>
步骤3:禁用 JNDI 查找
为了进一步提高安全性,我们建议禁用 Log4j 中的 JNDI 查找功能。为此,您可以在 Log4j 的配置文件中添加以下设置:
xml复制代码
<Configuration>
<Properties>
<Property name="disableJndiLookup">true</Property>
</Properties>
...
</Configuration>
或者,如果您正在运行的是较旧版本的 Log4j,则可以设置环境变量 LOG4J_FORMAT_MSG_NO_LOOKUPS 的值为 true,以禁用消息格式化中的 JNDI 查找。
结论
CVE-2021-44228 安全漏洞是 Log4j 2.x 版本中存在的一个严重问题,攻击者可以利用此漏洞来执行任意代码或获取敏感信息。为了确保您的应用程序不受影响,请立即升级到最新版本的 Log4j 并禁用 JNDI 查找功能。