Java 類序列化
Java 序列化和反序列化
在很多語言中都提供了對象反序列化支持,Java在JDK1.1(1997年)時就內置了對象反序列化(java.io.ObjectInputStream)支持。Java對象序列化指的是將一個Java類實例序列化成字節數組,用于存儲對象實例化信息:類成員變量和屬性值。 Java反序列化可以將序列化后的二進制數組轉換為對應的Java類實例。
Java序列化對象因其可以方便的將對象轉換成字節數組,又可以方便快速的將字節數組反序列化成Java對象而被非常頻繁的被用于Socket傳輸。 在RMI(Java遠程方法調用-Java Remote Method Invocation)和JMX(Java管理擴展-Java Management Extensions)服務中對象反序列化機制被強制性使用。在Http請求中也時常會被用到反序列化機制,如:直接接收序列化請求的后端服務、使用Base編碼序列化字節字符串的方式傳遞等。
Java反序列化漏洞
自從2015年Apache Commons Collections反序列化漏洞(ysoserial的最早的commit記錄是2015年1月29日,說明這個漏洞可能早在2014年甚至更早就已經被人所利用)利用方式被人公開后直接引發了Java生態系統的大地震,與此同時Java反序列化漏洞仿佛掀起了燎原之勢,無數的使用了反序列化機制的Java應用系統慘遭黑客瘋狂的攻擊,為企業安全甚至是國家安全帶來了沉重的打擊!
直至今日(2019年12月)已經燃燒了Java平臺四年之久的反序列化漏洞之火還仍未熄滅。如今的反序列化機制在Java中幾乎成為了致命的存在,反序列化漏洞帶來的巨大危害也逐漸被我們熟知。2018年1月Oracle安全更新了237個漏洞,而反序列化漏洞就占了28.5%,由此可見Oracle對反序列化機制的深惡痛絕。2012年JEP 154提出了移除反序列化機制:JEP 154: Remove Serialization、JDK-8046144,但似乎并未通過,移除反序列化是一個持久性的工作,短期內我們還是需要靠自身去解決反序列化機制帶來的安全問題。
Java Web安全
推薦文章: