2016 年 Java 應用程序及開發者受到反序列化漏洞的破壞性影響,而如今 .NET 生態系統也正在遭受同樣的危機。新的問題存在于 .NET 代碼庫中處理反序列化的操作中,攻擊者同樣可以通過這個漏洞在服務器或相關計算機設備上進行代碼注入。
我們知道,序列化指的是將對象轉化為字節序列以便保存在內存、文件、或數據庫中。而這個序列化過程主要是為了將對象的狀態保存下來,在之后有需要之時可以重新創建對象。而與之相反的過程則被稱為反序列化。而在這個過程中,如果沒有對數據進行安全性檢驗,而直接對不可信數據進行反序列化處理,那么攻擊者可以通過構建惡意的數據輸入,讓反序列化構建的對象帶來非預期的結果,帶來任意代碼執行的后果。
2015 –2016 年的 Java 反序列化啟示
自2011年開始,攻擊者就開始利用反序列化問題發起攻擊。
2015年上半年,兩名研究員Chris Frohoff 和 Gabriel Lawrence 發現 Apache Commons Collection 中的反序列化漏洞后,這個問題才真正開始讓每個開發者頭疼。
在2015年年底,Foxglove Security 的安全研究員,揭開了攻擊者如何利用Java程序中的反序列化漏洞進行攻擊。
研究調查顯示,常見的Java app 中均存在這個問題(如 WebLogic,WebSphere,JBoss,Jenkins 以及 OpenNMS)。攻擊者可以利用漏洞進行惡意數據上傳,而上傳上去的數據會被序列化,然后存儲到數據庫或內存中,當 app 反序列化這些數據內容時,就會觸發惡意代碼,影響整個系統。
這個漏洞在 2016 年撼動了整個Java 生態系統,也影響到了 70余個其他的Java 庫,甚至還讓 PayPal 的服務器遭受影響。而大型的組織和機構,如Apache, Oracle, Cisco, Red Hat, Jenkins, VMWare, IBM, Intel, Adobe, HP, 和 SolarWinds之類,都對自己的系統和產品進行徹底排查和漏洞修復。
Java 反序列化漏洞造成了嚴重的影響,還引發 Google工程師的 “在業余時間修復開源Java 庫” 的活動,他們共計修復了2600多個項目,以減輕此漏洞帶來的影響。盡管在谷歌的內部,這個漏洞的別名叫做“瘋狂小工具”(Mad Gadget),但對整個世界而言,反序列化漏洞問題是 Java 世界的一次浩劫。
反序列化問題同樣影響 .NET 應用程序
目前,惠普軟件的兩名研究員 Alvaro Mu oz 和 Oleksandr Mirosh 發現,一個與此前Java 反序列化漏洞相似的問題也在 .NET 中重現了。
和 Java 應用程序一樣,漏洞存在于 .NET 庫中反序列化過程中,處理序列化數據的方法中,而當目標計算機運行時這些惡意注入的代碼就會執行。和 Java世界同樣,這些 .NET 漏洞在整個生態系統中并非全部存在。某些 .NET 庫是不受影響的,開發時可以正常使用這些庫。還有一些應用即便使用了受影響的庫,也是安全的,因為程序員在應用中禁用了獲取序列化數據的函數和方法。
在他們的研究報告中,Mu oz 和 Mirosh 將研究重點放在分析使用 JSON 存儲數據的 .NET /Java 反序列化漏洞上。他們指出哪些應用程序是安全可靠的,開發人員應該如何在使用 JSON 數據時,避免遭受反序列化攻擊。
許多常見 .NET 項目中存在的反序列化漏洞
這些漏洞不只是理論層面已經發現,在實際的應用中也已經證實會造成影響,研究人員發現在 .NET 數據管理后端框架 Breeze 中存在 JSON 反序列化漏洞 CVE-2017-9424; 還有 CVE-2017-9785,這是一個存在于 NancyFX 中的反序列化漏洞——基于 Ruby 的 輕量級 .NET web 框架。
而除了JSON 反序列化之外,還有一些 .NET 庫中還存在著 XML 數據對象的反序列化問題。研究員發現DotNetNuke 這個流行的 .NET CMS系統中也存在 XML 反序列化漏洞。
如上所述,這些問題是由各種 .NET庫中的漏洞組合而成的,同時也是因為開發人員的不良編碼實踐導致的,他們沒有意識到序列化數據并不一定是安全的。由此避免此類的安全問題除了修復 .NET庫之外,還需要對開發者的編程習慣加以規范。
序列化過程很能影響產品的安全性的,開發時需要注意不能使用未加驗證的數據。反序列化問題并非只出現在 Java 序列化之中,或者如JSON,XML之類特定的 .NET 數據格式中。所有序列化操作后都會重新創建對象,攻擊注入的代碼即可能被其他方法調用,觸發任意代碼執行。
今年8月初,研究小組也在美國拉斯維加斯舉行的 Black Hat和DEF CON安全會議上發表了他們的調查結果。