一、产生原因
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功能。