Oracle Coherence&WebLogic反序列化遠程代碼執行漏洞風險通告

發布時間 2020-03-06

漏洞編號和級別


CVE編號:CVE-2020-2555,危險級別:嚴重,CVSS分值:9.8


影響版本


Oracle Coherence 3.7.1.17

Oracle Coherence 12.1.3.0.0

Oracle Coherence 12.2.1.3.0

Oracle Coherence 12.2.1.4.0


漏洞概述


近日,包含在1月份Oracle關鍵補丁程序更新CPU(Critical Patch Update)的漏洞,Oracle Coherence反序列化遠程代碼執行漏洞(CVE-2020-2555)的細節已被公開。


Oracle Coherence為Oracle融合中間件中的產品,是業界領先的內存數據網格解決方案,它能為公司和組織提供對常用數據的快速訪問。在WebLogic 12c及以上版本中默認集成到WebLogic安裝包中。Oracle Coherence中的反序列化遠程代碼執行漏洞允許未經身份驗證的攻擊者通過精心構造的T3網絡協議請求進行攻擊。成功利用該漏洞的攻擊者可以在目標主機上執行任意代碼。


漏洞驗證


漏洞細節詳見:https://www.zerodayinitiative.com/blog/2020/3/5/cve-2020-2555-rce-through-a-deserialization-bug-in-oracles-weblogic-server。


通過補丁找到漏洞利用點


CVE-2020-2555漏洞是由于攻擊者可以傳入可控參數并調用java方法。在Java中,類中的readObject()或readExternal()方法可以被自動調用。這兩種方法以及從它們內部可獲得的任何其他方法都可以視為反序列化gadget的來源。


CVE-2020-2555的補丁中更改了LimitFilter類中的toString()方法,如圖:



補丁在toString()中刪除了對extract()方法的所有調用語句,下文將介紹extract()方法的重要性。此處修改特別有趣,因為我們可以通過各種標準JRE類(例如BadAttributeValueExpException)的readObject()方法訪問toString()如上面的代碼所示,BadAttributeValueExpException類的序列化實例可以用于調用任意類的toString()方法。此方法可用于訪問受此補丁影響的LimitFilter類的toString()方法。



有關使用toString()作為入口點的gadget的示例,請參見ysererial項目的CommonsCollections5 gadget 。


Sink點的尋找


Sink點指的是具有各種副作用的Java方法調用,這類副作用包括:      


-通過調用FileOutputStream.write()任意創建文件。      

-通過調用Runtime.exec()任意執行命令。      

-通過調用Method.invoke()的任意方法調用。


對于此漏洞,我們的重點是對Method.invoke()的調用,此方法的調用可以通過反射來調用任意Java方法。了解該信息后,我們可以查找所有存在extract()方法的實例,并且最終會調用Method.invoke()。在Coherence庫中,似乎只有這樣一個可序列化類的實例(實現Serializable或Externalizable接口)。



查看ReflectionExtractor類后,我們可以確認前面的猜測:



ReflectionExtractor提供危險的原語,允許攻擊者調用任意方法,并且攻擊者可以控制其中的方法和參數。


實現RCE


通常,利用遠程代碼執行漏洞需要多個方法調用。例如,在流行的Apache Commons Collections的gadget,攻擊者需要使用ChainedTransformer將任意方法調用串接起來,從而實現RCE。與此類似,Coherence庫中也提供了這樣一個類(ChainedExtractor),可以讓我們串接extract()調用:



將以上信息結合起來,我們可以使用如下調用鏈,最終實現遠程代碼執行,如果目標環境使用了Coherence庫,并且攻擊者可以投遞惡意序列化對象,那么攻擊者就能實現遠程代碼執行。




修復建議


官方已經針對此漏洞發布補丁,請受影響的用戶參考以下鏈接安裝補丁更新:https://www.oracle.com/security-alerts/cpujan2020.html。


臨時修復建議


若相關用戶暫時無法安裝修復補丁,可通過控制T3協議的訪問來臨時阻斷針對利用T3協議漏洞的攻擊。


1. 進入weblogic控制臺,在base_domain的配置頁面中,進入“安全”選項卡頁面,點擊“篩選器”,進入連接篩選器配置。

2. 在連接篩選器中輸入:weblogic.security.net.ConnectionFilterImpl,在連接篩選器規則中輸入127.0.0.1 * * allow t3 t3s,0.0.0.0/0 * * deny t3 t3s(t3 和t3s 協議的所有端口只允許本地訪問)。

3. 保存并重啟服務器即可生效。


參考鏈接


https://www.zerodayinitiative.com/blog/2020/3/5/cve-2020-2555-rce-through-a-deserialization-bug-in-oracles-weblogic-server