一、漏洞说明
Apache Log4j2是一个基于Java的日志记录工具。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置,经阿里云安全团队验证,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响。
漏洞适用版本为 2.0 <= Apache log4j2 <= 2.14.1
,只需检测Java应用是否引入 log4j-api , log4j-core 两个jar。若存在应用使用,极大可能会受到影响。
二、临时修复方案
方式1:
-
修改启动脚本或命令,添加“-Dlog4j2.formatMsgNoLookups=true ” 启动参数和参数值(不包括引号)。
-
使用修改后的脚本或命令重启服务。
例如:
原本启动脚本或命令: java -jar file.jar
修 改 后 启 动 脚 本 或 命 令 : java -Dlog4j2.formatMsgNoLookups=true -jar file.jar
现已验证 jdk1.7 及以上版本(绝大多数 jdk 版本)均可通过该种
方式规避漏洞,若 jdk 环境低于 1.7 版本,请升级至 1.7 及以上版本。为 避免低版本 jdk 平台存在漏洞利用的情况,请及时升级,升级后需要及时 观察并监测应用业务是否运行正常,若存在异常情况需要及时回退至原来 的 jdk 版本,避免影响生产环境业务。
方式2:
在应用classpath下添加log4j2.component.properties配置文件,文件内容为log4j2.formatMsgNoLookups=true;
也可以通命令行参数指定:
java -Dlog4j.configurationFile=../config/log4j2.component.properties
方式3:
将系统环境变量 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为 true
注:以上3种方式也可以同时实施,以确保服务器环境安全可靠。
三、研发源码级修复方案
1. 通过版本覆盖,将项目依赖的Log4j2升级到最新版本
此种方式 适用于 项目对 Log4j2 有强依赖的场景,即 缺少依赖程序无法启动或者无法正常工作 的项目。
- 在项目主
pom.xml
中引入Log4j2的最新版本进行版本覆盖:
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.17.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.17.0</version>
</dependency>
</dependencies>
注:官方已发布最新的 2.17.0 版本。如本地仓库加载不到,可以配置官方的snapshot仓库(https://repository.apache.org/content/groups/),或者下载jar文件后上传到本地的私服库 来解决。
@RunWith(SpringRunner.class)
@SpringBootTest
@Log4j2
public class SpringTests {
@Test
public void test(){
log.error("${jndi:ldap://127.0.0.1:1389/#Exploit}");
log.error("${}","jndi:ldap://127.0.0.1:1389/#Exploit");
}
}
可以正常输出日志,不执行命令则漏洞修复生效。
- 利用 Idea 插件 maven helper 进行验证
- 查看打包后的 jar 文件进行验证
2.将项目中的 Log4j2 依赖排除
此种情况 适用于 项目对 Log4j2 没有强依赖的场景。
利用 Maven Helper 插件搜索出,依赖关系,在引入依赖的节点直接将 Log4j2 的引入排除掉 即可,例如:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>
注: 排除后需要验证: 项目能否正常启动? 项目功能是否正常?
四、第三方应用服务修复
- 此次漏洞受影响的范围还是非常广泛的,包括一些常用的中间件、数据库,如果: ES、Kafka等;
- 这些第三方的应用服务,修复起来是比较棘手的,短时间内在官方没有发布安全版本的情况下,只能临时通过替换应用目录中的jar文件的方式进行修复;
- 可以去官方的snapshot库下载最新的 jar 文件,对第三方服务进行替换操作;
- 注意做好文件备份工作,有的服务可能会出现启动失败的情况;
官方库地址:https://repository.apache.org/snapshots
五、漏洞修复注意事项
- 修复程序版本是否与项目现场的版本匹配?
- 修复完成后 要保证项目能够正常启动,且功能正常,有条件的最好部署到测试环境验证一下;
- 工程实施部署时,一定要提前备份好部署包 和 相关数据;