您的位置:

Log4j漏洞修复方案

一、产生原因

Log4j漏洞产生原因是因为Log4j2核心库中存在一个基于JNDI的任意代码执行漏洞,通过恶意构造特定的Class路径变量,攻击者便可控制JNDI上下文,最终在应用中任意执行代码。

这个问题的出现是源于Log4j2中的JNDI Lookup,这个Lookup是在默认的情况下启用的。在高版本的log4j中已经关闭了JNDI Lookup,但1.x版本中这个设置默认是开启的。

二、漏洞影响范围

这个漏洞在log4j2.0-2.14.1版本之间,log4j-core组件中存在,当组件中与JNDI Query交互时,便会存在远程攻击的可能性。

三、漏洞防御方案

1、更新log4j版本

参考官方的建议,更新log4j-core组件并且把相关的被动依赖也需跟着更新。更新版本号如下:

log4j-core      2.15.0
log4j-api       2.15.0
log4j-jul       2.15.0
log4j-slf4j-impl        2.15.0
log4j-web       2.15.0
log4j-over-slf4j        2.15.0

2、关闭JNDI Lookup

假如不想更新log4j版本,可关闭JNDI Lookup,可以手动修改配置项,禁用JNDI Lookup来避免这个问题。

<Properties>
    <Property name="log4j2.formatMsgNoLookups">true</Property>
</Properties>

或者直接禁用掉JNDI Lookup:

<Properties>
    <Property name="log4j2.formatMsgNoLookups">true</Property>
</Properties>

<Loggers>
    <Root level="info">
        <AppenderRef ref="File"/>
    </Root>
    <Logger name="org.apache.logging.log4j" level="WARN"/>
    <Logger name="com.acme" level="DEBUG">
        <AppenderRef ref="Console"/>
    </Logger>
</Loggers>

可以发现,关闭JNDI Lookup只需要在log4j2.xml文件中新增一段<Logger name="org.apache.logging.log4j" level="WARN"/>即可。

四、修复的代码示例

更新log4j-core组件或者禁用掉JNDI Lookup这两种方法都可以修复这个漏洞。修改log4j2的配置文件,添加一个Logger配置来禁用JNDI Lookup,代码如下:

<Properties>
    <Property name="log4j2.formatMsgNoLookups">true</Property>
</Properties>
<Loggers>
    <Root level="info">
        <AppenderRef ref="Console"/>
    </Root>
    <Logger name="org.apache.logging.log4j" level="WARN"/>
</Loggers>

此配置省略了默认的<Appenders>标签,使日志控制台输出到终端。

五、总结

本文介绍了Log4j漏洞的产生原因、影响范围以及漏洞修复方案。为保证代码安全,建议在项目中使用较新的log4j版本或禁用JNDI Lookup功能。