1、环境变量中增加如下配置:
LOG4J_log4j2.formatMsgNoLookups=true
2、项目classpath下新建配置文件log4j2.component.properties,内容如下:
log4j2.formatMsgNoLookups=true
3、jvm虚拟机选项中通过-D加载如下参数配置;
-Dlog4j2.formatMsgNoLookups=true
如图所示:
需要注意的是,以上三种方式可以任选其一进行配置缓解,如果同时使用了2种及以上的情况,要注意优先级权重。jvm的权重最高,其次是log4j2.component.properties配置文件,最后是环境变量。最终是否受漏洞影响,以权重高的设置项为准。或者将几个配置都设置为true,就无需考虑优先级权重得问题。
在看官方的相关文档中,说到了配置会覆盖的情况,没太理解是什么意思。按照字面意思理解配置文件和环境变量的设置可以覆盖jvm的设置,环境变量的设置可以覆盖配置文件的设置,实际测试过程中并没有覆盖。
当受影响的log4j2<2.10版本时,可以用如下缓解措施:
在项目src目录中的配置文件log4j2.xml中,修改PatternLayout的值,如下:
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg{nolookups}%n"/>
或
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m{nolookups}%n"/>
完整得文件:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<!-- 默认打印到控制台 -->
<Console name="Console" target="SYSTEM_OUT">
<!-- 关键内容 -->
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg{nolookups}%n"/>
</Console>
</Appenders>
<Loggers>
<!-- 默认打印日志级别为 error -->
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
另外log4j2.xml中中有配置默认得打印日志级别,如上文配置的日志打印级别是error,如果上面这样配置,info、warn之类的日志打印就不会触发漏洞。具体的日志打印级别说明:
共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
All:最低等级的,用于打开所有日志记录.
Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出.
Debug:指出细粒度信息事件对调试应用程序是非常有帮助的.
Info:消息在粗粒度级别上突出强调应用程序的运行过程.
Warn:输出警告及warn以下级别的日志.
Error:输出错误信息日志.
Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志.
OFF:最高等级的,用于关闭所有日志记录.
程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。
也就是说如果配置打印级别为最高得OFF, 通过这种粗暴方式也是可以缓解漏洞影响的,只是业务中就不会有一些相关的日志输出了,如下:
`<Loggers> <!-- 日志打印级别设置成了off --> <Root level="off"> <AppenderRef ref="Console"/> </Root> `
`</Loggers>`