什麽是序列化?
自從JDK1.1在1997年發布以來,序列化就壹直存在於Java平臺中。
它用於* * *在套接字之間共享對象表示,或者保存對象及其狀態以備將來使用(反序列化)。
在JDK10及以下版本中,序列化作為java.base包和java.io.Serializable方法的壹部分存在於所有系統中。
序列化的挑戰和限制
序列化的局限性主要表現在以下兩個方面:
出現了新的對象傳輸策略,如JSON、XML、ApacheAvro、ProtocolBuffers等。
1997的系列化策略無法預見現代互聯網服務的構建和攻擊。
序列化漏洞攻擊的基本前提是找到對反序列化數據執行特權操作的類,然後向它們傳遞惡意代碼。
序列化在哪裏?我如何知道我的應用程序是否使用序列化?
要刪除序列化,您需要從java.io包開始,它是java.base模塊的壹部分。常見的使用場景有:
實現Serializable接口和(可選)serialversionuid長整型字段。
請使用ObjectInputStream或ObjectOutputStream。
使用嚴重依賴序列化的庫,如Xstream、Kryo、BlazeDS和大多數應用服務器。
使用這些方法的開發人員應該考慮使用其他替代方法來存儲和讀回數據。EishaySmith公布了不同序列化庫的幾個性能指標。評估性能時,基準測試指標中需要考慮安全性。默認的Java序列化“更快”,但漏洞也會以同樣的速度向您襲來。
我們如何減少序列化缺陷的影響?
Amber項目包含關於隔離序列化API的討論。我們的想法是將序列化從java.base移到壹個單獨的模塊中,以便應用程序可以完全刪除它。在確定JDK11的函數集時,此建議沒有獲得任何結果,但在未來的Java版本中可能會繼續討論。
通過運行時保護減少序列化暴露
對許多企業來說,壹個能夠監控風險和自動化可重復安全專業知識的系統非常有用。Java應用程序可以將JVMTI工具嵌入安全監控系統中,並通過插入樁將傳感器插入應用程序中。
其他有用的安全技術
在維護中,您不需要手動列出壹長串事情,而是使用像OWASPDependency-Check這樣的系統,該系統可以識別已知安全漏洞的依賴關系並提示升級。妳也可以考慮通過像DependABot這樣的系統自動更新庫。
盡管本意是好的,但默認的Oracle序列化篩選器具有與SecurityManager和相關沙盒漏洞相同的設計缺陷。由於需要混淆角色權限並提前了解未知情況,因此該功能的大規模采用受到限制:系統管理員不知道代碼的內容,因此無法列出類文件,而開發人員不了解環境,甚至DevOps團隊通常也不知道系統其他部分(如應用服務器)的要求。