java反序列化安全例項解析
什麼是序列化
序列化 (Serialization)將物件的狀態資訊轉換為可以儲存或傳輸的形式的過程。在序列化期間,物件將其當前狀態寫入到臨時或永續性儲存區。以後,可以通過從儲存區中讀取或反序列化物件的狀態,重新建立該物件。
簡單來說:
序列化: 將資料結構或物件轉換成二進位制串的過程
反序列化:將在序列化過程中所生成的二進位制串轉換成資料結構或者物件的過程
下面是將字串物件先進行序列化,儲存到本地檔案,然後再通過反序列化進行恢復的樣例程式碼:
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
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 技術中。
漏洞危害
案例一:Apache ActiveMQ 5.12.0 遠端程式碼執行漏洞(JMS)
Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,該漏洞源於程式未能限制可在代理中序列化的類。遠端攻擊者可藉助特製的序列化的Java Message Service (JMS) ObjectMessage物件利用該漏洞執行任意程式碼。
受到影響的訊息系統如下
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的序列化類。
本地構造惡意的序列化物件
構造惡意的序列化物件傳送給目標主機:
執行系統命令
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埠
連線遠端服務埠,傳送惡意序列化資料包
這樣在Jenkins的根目錄就會生成一個pwned檔案。
受影響的版本
All Jenkins main line releases up to and including 1.649
All Jenkins LTS releases up to and including 1.642.1
漏洞防禦
1、反序列化物件白名單控制,在resolveClass方法中校驗物件名字。
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
public
class
LookAheadObjectInputStream extends
ObjectInputStream {
public
LookAheadObjectInputStream(InputStream inputStream)
|