Apache Commons Collections是一個擴充套件了Java標準庫裡的Collection結構的第三方基礎庫,它提供了很多強有力的資料結構型別並且實現了各種集合工具類。
1.反序列化原因
如果Java應用對使用者輸入的內容做了序列化,但是使用者輸入的內容是不可信的資料,進行了惡意構造,那麼在對惡意構造的資料做反序列化處理,就會產生的非預期物件,在這個過程中就可能帶來任意程式碼執行。
2.漏洞原理
在進行Map轉換時,修改Map中的key和value會呼叫介面,觸發內建的transform來獲取類名、方法物件進行反射,其中傳入的方法名,引數型別等都是可控的,那麼我們就可以構造ChainedTransformer來進行反射,呼叫任意函式
3.影響版本
commons-collections<=3.2.1存在漏洞
4.下載地址
本文對commons-collections-3.2.1進行漏洞分析,下載地址:https://github.com/SQYY/Apache-Commons-Collections/raw/master/commons-collections-3.2.1-1.0.0.jar
5.漏洞分析
在 org/apache/commons/collections/map/TransformedMap.class中可以看到decorate()方法,它是將一個Map物件,轉換成TransformedMap物件。
可以看到它會把它的三個引數帶入到TransformedMap方法中,並返回例項化的結果。而在這個方法中,如上圖所示,就是將Map中的key和value轉換成TransformedMap中的key和value
而 transform是一個介面,即可實現資料變換的操作。當Map中的任意項的Key或者value被修改,這個介面就會被呼叫。
在 org/apache/commons/collections/functors/InvokerTransformer.class中,也是我們核心的關鍵點,可以看到它實現了transform和Serializable這兩個介面
可以看到transform中,首先會getClass獲取傳入引數的類名,再通過getMethod獲取方法物件,最後呼叫invoke進行反射
就是說只需要傳入方法名、引數型別和引數,我們就可以通過Java的反射機制可以呼叫任意函式。
5.修復方式
commons-collections升級到3.2.2或更高版本。
通過maven配置更新commons-collections,使用3.2.2或者最新版本,參考如下
<dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.2</version></dependency>