前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Apache Log4j漏洞修复

Apache Log4j漏洞修复

作者头像
心平气和
发布2021-12-13 14:23:21
1.4K0
发布2021-12-13 14:23:21
举报

这个应该是技术人最近谈的比较多的话题了,有的公司连夜在修复,这个时候也体现每家公司的工程化能力了,是一个个应用去发版,还是只要中间件层面动一动就可以看到各家公司的技术实力了。

这个话题网上已经有很多文章了,好多是讲原因的,我就不在这里重述了,这篇文章重点讲下识别和处理。

一、如何确定是否中招或已经修复

代码语言:javascript
复制
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Test {

    public static void main(String[] args) {
        Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
        String cmdMessage = "${jndi:rmi://127.0.0.1:8081/ExportObject}";
        logger.info("log4j2testinfo"+cmdMessage );
        logger.error("log4j2testerror"+cmdMessage );
        logger.warn("log4j2testwarn"+cmdMessage );
    }
    }

如果运行上面的代码之后报错误有什么lookup的错误,或者有监听了8081端口,则说明你的系统中招了,或者还没修复完毕;

二、查看依赖的库是否如何引用的

查看依赖树,看是否有相关库,具体运行如下命令:

代码语言:javascript
复制
mvn dependency:tree

如果有以下的库则要注意版本了,如果版本在2.x到2.15.0-rc1之间则要及时修复;

注意类的全名开头是org.apache.logging,如果直接是log4j的则不影响:

三、解决方案

1、找到相应的依赖jar包,引入的时候排除掉

代码语言:javascript
复制
<dependency>
      <groupId>com.xx.framework</groupId>
      <artifactId>xx-log4j2-starter</artifactId>
      <exclusions>
          <dependency>
              <groupId>org.apache.logging.log4j</groupId>
              <artifactId>log4j-api</artifactId>
          </dependency>
          <exclusion>
              <groupId>org.apache.logging.log4j</groupId>
              <artifactId>log4j-core</artifactId>
          </exclusion>
          <exclusion>
              <groupId>org.apache.logging.log4j</groupId>
              <artifactId>log4j-jul</artifactId>
          </exclusion>
          <exclusion>
              <groupId>org.apache.logging.log4j</groupId>
              <artifactId>log4j-slf4j-impl</artifactId>
          </exclusion>
      </exclusions>
  </dependency>

项目中用的比较多的是下面几个包:

log4j-api

log4j-core

log4j-jul

log4j-slf4j-impl

2、手动引入相关依赖包

代码语言:javascript
复制
<dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.15.0-RC2</version>
</dependency>
<dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>2.15.0-RC2</version>
 </dependency>
 <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-slf4j-impl</artifactId>
      <version>2.15.0-RC2</version>
 </dependency>
 <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-jul</artifactId>
      <version>2.15.0-RC2</version>
</dependency>

还有一种办法,就是修改相关参数,jvm启动参数增加

-Dlog4j2.formatMsgNoLookups=true

这个是偷懒的办法,即不升级jar包的情况下修改参数,而禁用相关功能,这个作为临时的方案,不建议在生产上长期使用;

四、总结

解决方案主要是升级相关jar包,当然可以临时关闭下相关功能然后再升级;

Java中有很多功能比较强大的反射API,允许直接编译Java代码,这些是双刃剑,用的不好就容易中招,所以针对这个API如果处理的参数有用户输入的就特别需要注意,就像Fastjson一样,性能是强了,但也很容易被黑客利用,因此在程序中对所有输入参数做好安全处理,建议通过拦截器等方式在请求进来的时候做统一处理,这样后续有需求也方便统一处理。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员升级之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档