Log4j 的远程代码执行漏洞
12 月 10 日凌晨,Apache 开源项目 Log4j 的远程代码执行漏洞细节被公开,由于 Log4j 的广泛使用,该漏洞一旦被攻击者利用会造成严重危害。受本次漏洞影响的版本范围为 Apache Log4j 2.x < 2.15.0-rc2,攻击者可以利用此漏洞在目标服务器上执行任意代码,通过 JNDI 来执行 LDAP 协议来注入一些非法的可执行代码。
攻击检测
(1)可以通过检查日志中是否存在 “jndi:ldap://”、“jndi:rmi” 等字符来发现可能的攻击行为。
(2)检查日志中是否存在相关堆栈报错,堆栈里是否有 JndiLookup、ldapURLContext、getObjectFactoryFromReference 等与 jndi 调用相关的堆栈信息。
官方修补建议
1、排查应用是否引入了 Apache log4j-core Jar 包,若存在依赖引入,且在受影响版本范围内,则可能存在漏洞影响。请尽快升级 Apache Log4j2 所有相关应用到最新的 log4j-2.15.0-rc2 版本,地址 https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2
2、升级已知受影响的应用及组件,如 spring-boot-starter-log4j2/Apache Struts2/Apache Solr/Apache Druid/Apache Flink
3、可升级 jdk 版本至 6u211/ 7u201 / 8u191 / 11.0.1 以上,可以在一定 程度上限制 JNDI 等漏洞利用方式。
4、在无法升级版本时,通过修改 jvm 参数、系统环境变量等方式,可在一 定程度上缓解该风险,但无法完全修复,因此不建议通过修改参数的方式解决该风险。
- 修改 JVM 参数, 设置
-Dlog4j2.formatMsgNoLookups=true
。 - 在涉及漏洞的项目的类路径(classpath)下增加
log4j2.component.properties
配置文件并增加配置项log4j2.formatMsgNoLookups=true
。
5、采用 rasp 对 lookup 的调用进行阻断。
6、采用 waf 对请求流量中的 ${jndi 进行拦截。
log4j-2.15.0-rc1 发布了紧急补丁。
https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc1
但不久又被发现依然存在新的问题。若是使用 Java 开发语言的系统需要尽快确认是否使用 Apache Log4j 2 插件,并尽快升级到最新的 log4j-2.15.0-rc2 版本。
https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2
maven 的中央仓库发现这个版本。需要自行编译。
下载地址:https://github.com/apache/logging-log4j2/archive/refs/tags/log4j-2.15.0-rc2.tar.gz
或
https://gitee.com/apache/logging-log4j2/tags
今天凌晨已经把 log4j-2.15.0-rc2 源代码编译成功,睡了回笼觉,补一下 log4j-2.15.0-rc2 源代码编译过程,分享给大家。
log4j-2.15.0-rc2 源代码编译
使用 docker 编译 log4j-2.15.0-rc2;
docker run -v C:\Users\Lenovo\dock:/opt -it hub.c.163.com/public/centos:7.2.1511 bash
安装 jdk8(略)
安装 apache-maven-3.6.3
cd /opt
wget https://mirrors.ocf.berkeley.edu/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz --no-check-certificate
mkdir /opt/maven
tar -zxvf apache-maven-3.6.3-bin.tar.gz -C /opt/maven
设置环境变量
编辑 vim /etc/profile 文件, 添加下面的命令:
export JAVAHOME=/opt/java/jdk1.8.0311
export MAVENHOME=/opt/maven/apache-maven-3.6.3
export CLASSPATH=.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jar
export PATH=$PATH:$JAVAHOME/bin:$MAVEN_HOME/bin
控制台执行,source /etc/profile
编译源代码
wget https://shrill-pond-3e81.hunsh.workers.dev/https://github.com/apache/logging-log4j2/archive/refs/tags/log4j-2.15.0-rc2.tar.gz
tar -xzvf log4j-2.15.0-rc2.tar.gz
cd /opt/logging-log4j2-log4j-2.15.0-rc2
mvn clean
#(出现问题可以查看问题列表,问题解决后,可以重新执行下面命令验证)
mvn install -Dmaven.test.skip=true
编译成功截图如下:
问题
1、maven-failesafe-plugin:3.0.0-M5
由于 yum 安装的版本比较老,有些项目不能打包,因此需要我们手动安装 apache-maven-3.6 以上版本即可解决。
2、project log4j-api-java9: Cannot find matching toolchain definitions for the following toolchain types:
[ERROR] jdk [ version=’[9, )’ ]
进入子目录,先编译,具体命令如下:
cd log4j-api-java9
cp ../toolchains-sample-linux.xml ../toolchains-sample-linux-9.xml
编辑 toolchains-sample-linux-9.xml,详见下图
mvn clean install -t ../toolchains-sample-linux-9.xml
如果回到项目根目录 cd …,执行命令 mvn install -Dmaven.test.skip=true 依然报该错误,请执行以下命令
cd log4j-api-java9
cp ../toolchains-sample-linux-9.xml ~/.m2/toolchains.xml
cd ..
mvn install -Dmaven.test.skip=true
3、project log4j-perf: Cannot find matching toolchain definitions for the following toolchain types:
[ERROR] jdk [ version=’[11, )’ ]
cp ../toolchains-sample-linux.xml ../toolchains-sample-linux-11.xml
编辑 toolchains-sample-linux-11.xml,详见下图
mvn clean install -t ../toolchains-sample-linux-11.xml
如果回到项目根目录,执行命令 mvn install -Dmaven.test.skip=true 依然报该错误,请执行以下操作;
vim ~/.m2/toolchains.xml 增加以下代码,保存后,回到项目根目录,执行命令 mvn install -Dmaven.test.skip=true 即可。
<toolchain>
<type>jdk</type>
<provides>
<version>11</version>
<vendor>sun</vendor>
</provides>
<configuration>
<jdkHome>/opt/java/jdk-11.0.13</jdkHome>
</configuration>
</toolchain>
Log4j出最新版本2.16.0,已推送到maven的中央仓库,是用该版本即可
maven:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.16.0</version>
</dependency>
Gradle: implementation group: ‘org.apache.logging.log4j’, name:
‘log4j-core’, version: ‘2.16.0’
— THE END —
【免责声明】图文来自网络,版权归原作者所有。如侵权请联系删除;我们对文中观点保持中立,仅供参考、交流之目的!
本文来自公众号:大技术
原文地址 zhuanlan.zhihu.com