Log4j2漏洞修复

一、漏洞说明

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:
  1. 修改启动脚本或命令,添加“-Dlog4j2.formatMsgNoLookups=true ” 启动参数和参数值(不包括引号)。

  2. 使用修改后的脚本或命令重启服务。

    例如:
    原本启动脚本或命令: 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

五、漏洞修复注意事项

  • 修复程序版本是否与项目现场的版本匹配?
  • 修复完成后 要保证项目能够正常启动,且功能正常,有条件的最好部署到测试环境验证一下;
  • 工程实施部署时,一定要提前备份好部署包 和 相关数据;
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值