Java反序列化漏洞詳解

Java反序列化漏洞原理

      序列化就是把對象轉換成字節流,便於保存在內存、文件、數據庫中;反序列化即逆過程,由字節流還原成對象。

      Java中的ObjectOutputStream類的writeObject()方法可以實現序列化,類ObjectInputStream類的readObject()方法用於反序列化。

     下面是將字符串對象先進行序列化,存儲到本地文件,然後再通過反序列化進行恢復的樣例代碼:

public static void main(String args[]) throws Exception { 
     String obj = "hello world!";

      // 將序列化對象寫入

public static void main(String args[]) throws Exception { 
     String obj = "hello world!";

      // 將序列化對象寫入文件object.db中
      FileOutputStream fos = new FileOutputStream("object.db");
      ObjectOutputStream os = new ObjectOutputStream(fos);
      os.writeObject(obj);
      os.close();
  
     // 從文件object.db中讀取數據
     FileInputStream fis = new FileInputStream("object.db");
     ObjectInputStream ois = new ObjectInputStream(fis);
 
     // 通過反序列化恢復對象obj
     String obj2 = (String)ois.readObject();
     ois.close();
 }

問題代碼分析:   

       如果Java應用對用戶輸入,即不可信數據做了反序列化處理,那麼攻擊者可以通過構造惡意輸入,讓反序列化產生非預期的對象,非預期的對象在產生過程中就有可能帶來任意代碼執行。

      所以這個問題的根源在於類ObjectInputStream在反序列化時,沒有對生成的對象的類型做限制;假若反序列化可以設置Java類型的白名單,那麼問題的影響就小了很多。

反序列化問題由來已久,且並非Java語言特有,在其他語言例如PHPPython中也有相似的問題。@gebl@frohoff的報告中所指出的並不是反序列化這個問題,而是一些公用庫,例如Apache Commons Collections中實現的一些類可以被反序列化用來實現任意代碼執行。WebLogicWebSphereJBossJenkinsOpenNMS這些應用的反序列化漏洞能夠得以利用,就是依靠了Apache Commons Collections

測試方法:

1、人工審計源代碼。

2、利用大佬共享的測試工具,進行測試。

修復建議

1、將服務器安裝的JDK升級到官方最新版本,可以防範目前以往所有公佈的Java反序列化漏洞。

2、對於weblogic中間件反序列化漏洞,需要及時打上最新的補丁,或者配置防火牆策略,屏蔽掉T3協議的訪問,只開放對HTTP、HTTPS訪問。

3、對於Jboss、tomcat等中間件的反序列化漏洞,可以將存在反序列化漏洞的jar包升級到最新版本,但特殊情況下,需要升級的jar包種類比較多,此修復建議很費時。

4、檢測防火牆配置,是否開啓對Java反序列化漏洞的防範策略。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章