【技術分享】JAVA反序列化安全實例解析

http://bobao.360.cn/learning/detail/3142.htmlhtml

什麼是序列化java

序列化 (Serialization)將對象的狀態信息轉換爲能夠存儲或傳輸的形式的過程。在序列化期間,對象將其當前狀態寫入到臨時或持久性存儲區。之後,能夠經過從存儲區中讀取或反序列化對象的狀態,從新建立該對象。安全

簡單來講:服務器

序列化: 將數據結構或對象轉換成二進制串的過程數據結構

反序列化:將在序列化過程當中所生成的二進制串轉換成數據結構或者對象的過程分佈式

http://p6.qhimg.com/t019c3c164997ef5740.png

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

 

1ui

2加密

3spa

4

5

6

7

8

9

10

11

12

13

14

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序列化應用於RMI JMX JMS 技術中。

 

漏洞危害

http://p3.qhimg.com/t010356b3efcba6aaa4.png

案例一:Apache ActiveMQ 5.12.0 遠程代碼執行漏洞(JMS)

Apache ActiveMQ 5.13.0以前5.x版本中存在安全漏洞,該漏洞源於程序未能限制可在代理中序列化的類。遠程攻擊者可藉助特製的序列化的Java Message Service (JMS) ObjectMessage對象利用該漏洞執行任意代碼。

http://p5.qhimg.com/t0135ba820c94abf99b.png

http://p1.qhimg.com/t0192f8cfc6e0f1cf9f.png

http://p4.qhimg.com/t016dc6527cc22d3a25.png

受到影響的消息系統以下

Apache ActiveMQ 5.12.0 and earlier

HornetQ 2.4.0 and earlier

Oracle OpenMQ 5.1 and earlier

IBM Websphere MQ 8.0.0.4 and earlier

Oracle Weblogic 12c and earlier

Pivotal RabbitMQ JMS client 1.4.6 and earlier

IBM MessageSight MessageSight V1.2 JMSClient and earlier

SwiftMQ JMS client 9.7.3 and earlier

Apache ActiveMQ Artemis client 1.2.0 and earlier

Apache Qpid JMS client 0.9.0 and earlier

Amazon SQS Java Messaging Library 1.0.0 and earlier

案例二:JBoss 反序列化漏洞(JMX)

Jboss利用的是HTTP協議,能夠在任何端口上運行,默認安裝在8080端口中。JMX是一個java的管理協議,在Jboss中的JMXInvokerServlet可使用HTTP協議與其進行通話。這一通訊功能依賴於java的序列化類。

本地構造惡意的序列化對象

http://p8.qhimg.com/t01fb4925819b7f5adc.png

構造惡意的序列化對象發送給目標主機:

http://p4.qhimg.com/t01193fd609436cc6a5.png

執行系統命令

http://p5.qhimg.com/t0173b19dfe98061b94.png

RedHat發佈JBoss相關產品的解決方案:

https://access.redhat.com/solutions/2045023

受影響的JBoss產品有:

Environment

Red Hat JBoss A-MQ 6.x

Red Hat JBoss BPM Suite (BPMS) 6.x

Red Hat JBoss BRMS 6.x

Red Hat JBoss BRMS 5.x

Red Hat JBoss Data Grid (JDG) 6.x

Red Hat JBoss Data Virtualization (JDV) 6.x

Red Hat JBoss Data Virtualization (JDV) 5.x

Red Hat JBoss Enterprise Application Platform 6.x

Red Hat JBoss Enterprise Application Platform 5.x

Red Hat JBoss Enterprise Application Platform 4.3.x

Red Hat JBoss Fuse 6.x

Red Hat JBoss Fuse Service Works (FSW) 6.x

Red Hat JBoss Operations Network (JBoss ON) 3.x

Red Hat JBoss Portal 6.x

Red Hat JBoss SOA Platform (SOA-P) 5.x

Red Hat JBoss Web Server (JWS) 3.x

案例三:

Jenkins Remoting的相關API是用於實現分佈式環境中master和slave節點或者master和CLI的訪問,API沒有身份認證而且支持序列化對象。CVE-2016-0788經過Jenkins Remoting巧妙地開啓JRMP,JRMP觸發反序列化操做,從而進行漏洞的利用。做者已經提供了完整利用POC:

在遠程服務器開啓JRMI端口

http://p6.qhimg.com/t01c04d1258f2ec690a.png

鏈接遠程服務端口,發送惡意序列化數據包

http://p4.qhimg.com/t012f481d7e180a1182.png

這樣在Jenkins的根目錄就會生成一個pwned文件。

受影響的版本

All Jenkins main line releases up to and including 1.649

All Jenkins LTS releases up to and including 1.642.1 

 

漏洞防護

一、反序列化對象白名單控制,在resolveClass方法中校驗對象名字。

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public class LookAheadObjectInputStream extends ObjectInputStream {

   public LookAheadObjectInputStream(InputStream inputStream)

         throws IOException {

      super(inputStream);

   }

   /**

    * Only deserialize instances of our expected Bicycle class

    */

   @Override

   protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException,

         ClassNotFoundException {

      if (!desc.getName().equals(Bicycle.class.getName())) {

         throw new InvalidClassException(

               "Unauthorized deserialization attempt", desc.getName());

      }

      return super.resolveClass(desc);

   }

}

二、序列化數據採用對稱加密進行傳輸,接口調用增長身份認證。(此種方法僅僅能提高攻擊成本)

三、由於序列化機制不能保證數據的完整和和保密性,若是類中存在敏感數據而且那麼這個類還須要序列化,須要在特定對象的一個域上關閉serialization,在這個域前加上關鍵字transient便可。

更多關注攜程安全應急響應中心公衆號(CSRC)

相關文章
相關標籤/搜索