【亲测有效】
漏洞背景
2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。2021年12月10日,阿里云安全团队发现 Apache Log4j 2.17.0-rc1 版本存在漏洞绕过,请及时更新至 Apache Log4j 2.17.0-rc2 版本。
漏洞描述
Apache Log4j2是一款优秀的Java日志框架。2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置,经阿里云安全团队验证,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响。2021年12月10日,阿里云安全团队发现 Apache Log4j 2.17.0-rc1 版本存在漏洞绕过,请及时更新至 Apache Log4j 2.17.0-rc2 版本。阿里云应急响应中心提醒 Apache Log4j2 用户尽快采取安全措施阻止漏洞攻击。【后面Apache团队也发现2.15.0和2.16.0版本也存在远程数据漏洞,最终升级为安全版本 2.17.0】
漏洞评级
Apache Log4j 远程代码执行漏洞——严重
漏洞状态
影响版本
经验证 2.17.0-rc1 版本存在绕过,实际受影响范围如下:Apache Log4j 2.x < 2.17.0-rc2
安全建议
- 排查应用是否引入了Apache log4j-core Jar包,若存在依赖引入,且在受影响版本范围内,则可能存在漏洞影响。请尽快升级Apache Log4j2所有相关应用到最新的 log4j-2.15.0-rc2 版本,地址 https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2
- 升级已知受影响的应用及组件,如 spring-boot-starter-log4j2/Apache Struts2/Apache Solr/Apache Druid/Apache Flink
- 可升级jdk版本至6u211 / 7u201 / 8u191 / 11.0.1以上,可以在一定程度上限制JNDI等漏洞利用方式。
解决方案
方案1(极力推荐)
此方式直接升级版本来解决,升级到安全版本(2.17.0)即可。要PS的是,我们引入安全版本依赖后,也要在starter-web启动器依赖里把Spring Boot自带的log依赖要排除掉(所谓铲草除根),因为Spring Boot封装的Apache Log4j2依赖暂时还没是最新版本,使用它可能会出现漏洞。重点来了,请参考如下代码:
原依赖(存在漏洞的):
<!-- 引入log4j2依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
【下面的 解决依赖1 和 解决依赖2 均可解决漏洞,将上面原依赖替换为下面的其中一个依赖】
解决依赖1:
<!-- 安全版本 2.17.0版本(Apache 原版的log依赖) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<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>
<!-- 去掉springboot默认配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions><!-- 去掉springboot默认配置 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
解决依赖2:
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<!-- 安全版本 2.17.0版本(Apache 原版的log依赖) -->
<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-api</artifactId>
<version>2.17.0</version>
</dependency>
<!-- 去掉springboot默认配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions><!-- 去掉springboot默认配置 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
升级到安全版本后,我们刷新Maven后能看到新依赖如下:
如果是Gradle版本,解决依赖如下:
修改build.gradle为:
dependencies {
compile group: 'org.apache.logging.log4j',
name: 'log4j-api',
version: '2.17.0-rc2'
compile group: 'org.apache.logging.log4j',
name: 'log4j-core',
version: '2.17.0-rc2'
}
安全版本相关源码:https://gitcode.net/mirrors/apache/logging-log4j2?utm_source=csdn_github_accelerator 或 https://github.com/apache/logging-log4j2/releases/tag/log4j-2.17.0-rc2
方案2
此方式通过部署方式和配置来临时解决漏洞,具体解决如下:
- 在jvm启动参数中添加 -Dlog4j2.FORMATMsgNoLookups=true;
- 系统环境变量中配置 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS=true;
- 项目中创建 log4j2.component.properties 文件,文件中增加配置 log4j2.formatMsgNoLookups=true;
- 采用 rasp 对 lookup 的调用进行阻断;
- 采用 waf 对请求流量中的 ${jndi} 进行拦截;
- 禁止不必要的业务访问外网。
好lala,Apache Log4j2漏洞已解决,希望能帮助到各位后端开发er,也麻烦各位大佬顺手 点赞 && 关注,蟹蟹!!!
后期会给大家推送更加深层技术和各种性能优化方案的鸡汤~~~