log4j2 lookup漏洞修复方法

小得盈满

2021/12/13

2021.12.10凌晨,Apache Log4j远程代码执行漏洞细节被公开,参考链接:https://unit42.paloaltonetworks.com/apache-log4j-vulnerability-cve-2021-44228/,也可以在cve网站上查询到:https://www.cve.org/CVERecord?id=CVE-2021-44228,当前漏洞适用的版本:Log4j 2.x <= 2.15.0-rc1,仅在Log4j 2中存在此漏洞,Log4j 1.x版本不受影响,下面举了几个例子,对于常见的开源软件或者引用该库的程序都可以按照下面的方法修复。

1.ElasticSearch

存在的版本:6.x、7.x、8.x,首先是建议开启用户名密码访问,提升安全性。

编辑ElasticSearch安装目录下的conf/jvm.options,添加jvm参数:

-Dlog4j2.formatMsgNoLookups=true

然后保存并退出文件,重启ElasticSearch服务生效,每个节点都要修改并重启。

c143aa31-6cdb-49f4-ba2c-68cf5dfedfcd

也可以下载最新的2.15.0的Log4j jar包替换掉elasticsearch lib下面的老版本Log4j jar包,然后重启ElasticSearch服务生效,具体的链接会在后面给出。

2.Kafka

版本:1.x、2.x

编辑kafka安装目录下的启动脚本:bin/kafka-server-start.sh,找到KAFKA_LOG4J_OPTS环境变量位置,编辑变量追加jvm参数:

# 修改export的值
export KAFKA_LOG4J_OPTS="-Dlog4j.configuration=file:$base_dir/../config/log4j.properties -Dlog4j2.formatMsgNoLookups=true"

3667d462-8a8d-4550-b40e-2447d51b077e

然后保存之后,重启kafka broker生效,即先使用停止脚本停掉服务再使用启动脚本启动服务,集群所有节点都需要操作。

3.Flink

版本2.11版本及以上,2.11以下的版本不受影响,然后编辑安装目录下的conf/flink-conf.yaml添加下面的配置:

env.java.opts: -Dlog4j2.formatMsgNoLookups=true

然后保存配置并退出,每个节点都要修改,最后停止flink集群后再启动即可生效。

4.maven项目

maven项目中关于log4j的引用可以直接升级到最新版本,pom配置如下:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.15.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.15.0</version>
</dependency>

官方已经将补丁合并至2.15.0稳定版,所以保存并更新maven依赖后,重新编译项目:

mvn package

生成新的jar包即可修复bug。

5.自己开发的java代码

下载新版本的log4j依赖包,然后使用log4j-api-2.15.0.jar和log4j-core-2.15.0.jar替换掉现有项目中的依赖并重新编译即可,下载链接在最后。

6.线上正在运行的独立java程序

对于正在独立运行的java程序可以按照下面的方法关闭。

6.1.添加jvm参数

和上面类似,比如:

java -cp .:./lib/*:./etc/log4j2.xml: -Dlog4j2.formatMsgNoLookups=true com.aaa.bbb.MainClass

6.2.添加配置文件

创建并编辑配置文件log4j2.component.properties内容为:

log4j2.formatMsgNoLookups=true

其实和jvm参数一样,只是这里用了配置文件来单独存放,这样保存配置后在启动java程序时添加到classpath中:

java -cp .:./lib/*:./etc/log4j2.xml:./etc/log4j2.component.properties: com.aaa.bbb.MainClass

6.3.导入环境变量

运行程序前导入环境变量:

export FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS=true

可以将变量配置到/etc/profile或者~/.bashrc中每次进入shell都会生效,然后再正常启动java程序即可。

其实上面的ElasticSearch、Kafka、Flink直接导入这个环境变量也是可以的,log4j相关的模块会自动读取该变量并进行设置。

总结来说,上面这些方法无非就是修改jvm参数或者设置相关的变量来关闭lookup的功能,从而切断远程代码执行,或者是直接升级官方最新的Log4j的版本来修复问题。

Log4j程序包下载:https://dlcdn.apache.org/logging/log4j/2.15.0/apache-log4j-2.15.0-bin.tar.gz