压在透明的玻璃上c-国产精品国产一级A片精品免费-国产精品视频网-成人黄网站18秘 免费看|www.tcsft.com

Checkmarx研究:Apache Dubbo 2.7.3–通過不可信數據的反序列化實現未經認證的RCE(CVE-2019-17564)

近年來,我們對序列化攻擊產生了濃厚的興趣。就在幾個月前,我們決定投入一點精力研究Apache Dubbo。據我們所知,Dubbo以多種方式對許多程序進行了反序列化處理。自Apache基金會使用Dubbo后,Dubbo在世界各地的用戶數量顯著增加。

image001
圖1 – Dubbo架構

據2019年中期新聞稿報道,中國有十幾家企業已經開始使用Dubbo,其中包括阿里巴巴集團、中國人壽、中國電信、當當網、滴滴出行、海爾和中國工商銀行等。該報道指出,Apache宣布將Dubbo提升為Apache頂級項目。

image002

圖2 – Dubbo用戶(圖片來源于Apache Dubbo官網)

我發現Apache Dubbo提供商和用戶使用的版本≤Dubbo 2.7.3,當配置可接受HTTP協議時,允許遠程攻擊者向暴露的服務發送惡意程序,從而導致遠程代碼執行的問題。這是在未經認證的情況下發生的,攻擊者只需知道很少的信息就可以利用此漏洞做文章。具體來說,如果HTTP啟用,在任何Dubbo實例上,攻擊者只需要利用此處所述的漏洞和一個URL就能順利攻破服務系統。本報告附有概念驗證視頻

攻擊者可以利用此漏洞破解Dubbo提供商的服務(該服務旨在從其消費者獲得遠程連接)。然后攻擊者可以用一個惡意的Dubbo提供商程序將現有Dubbo提供商程序替換掉。接下來,該替換程序可使用類似的惡意對象對消費者作出響應,從而激活遠程代碼執行程序,讓攻擊者攻破整個Dubbo集群。

造成這種漏洞問題的根本原因在于Spring框架中使用了遠程反序列化服務。Spring框架文檔明確建議,用戶切勿使用不可信的數據運用Spring框架。再加上庫(該庫含一個鮮為人知的小工具鏈)過時的問題,導致遠程代碼執行的問題產生。不可信數據反序列化處理的不安全隱患,加上小工具鏈的存在,造成遠程訪問和遠程未經認證的代碼執行無縫對接的隱患產生。

Chris Frohoff和Moritz Bechler的研究和工具(ysoserial和marshalsec)功不可沒。他們將一些代碼用在小工具鏈上,他們的研究為解決這種漏洞問題奠定了基礎。

嚴重級別

Checkmarx認為該漏洞的CVS評分為9.8(嚴重),因為它是一個未經認證的遠程代碼執行漏洞,在Dubbo服務的權限級別提供特權,從而完全破解了該服務的機密性、完整性和可及性。

雖然并非所有Dubbo實例都配置使用HTTP協議,但就配置使用該協議的Dubbo版本(帶有已知漏洞)而言,只要提供很少且隨時可用的信息(即存在漏洞的服務URL),這類系統就非常容易受到攻擊。任何人只要通過注冊表(如Zookeeper)等服務就可以在網上獲得上述服務URL,且該服務URL不被視為秘密或機密內容。

CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H/E:F/RL:U/RC:C/CR:H/IR:H/AR:H

規范

這是怎么回事?

激活遠程HTTP協議的Dubbo應用程序會產生反序列化的不安全問題。如果Apache Dubbo提供商實例啟用了HTTP,攻擊者就可以通過提交一個帶有Java對象的POST請求,完全破解該實例。

Dubbo HTTP實例試圖在Java ObjectStream中對數據進行反序列化處理,而Java ObjectStream包含一組惡意的類(常被稱為小工具鏈),調用該工具鏈會導致系統執行惡意代碼。在這種情況下,有問題的惡意代碼允許攻擊者對系統命令進行任意操作。異常創建期間,在這個小工具鏈上的Dubbo實例中進行內部toString調用時,小工具鏈就會被調用。

重建問題

攻擊者可以將帶有惡意對象的POST請求提交到Apache Dubbo HTTP服務的bean URL,以便執行遠程代碼。在這種情況下,bean是由Spring綁定到指定Dubbo協議端點的接口實現類。該bean連接到一個URL,該bean的請求體包含一個HTTP遠程調用,用于確定適合的bean調用方法和參數的選用。

攻擊者獲得bean的URL之后,他們只需要通過標準POST請求提交一個惡意的小工具鏈即可利用這個漏洞做文章。

如果HTTP服務和協議已經啟用,在具有Dubbo-Remoting-HTTP的vanilla Apache Dubbo范圍內能夠找到允許執行遠程操作系統命令的新小工具鏈。

為概念驗證(PoC)重建受損Dubbo HTTP實例

遵守以下指南:

  1. 遵守官方Apache Dubbo快速入門指南,直到成功創建能夠正常運行的提供商程序和注冊表
  2. 啟用Dubbo HTTP服務——編輯dubbo-demo-provider.xml ——將Dubbo協議名稱更改為“HTTP”

鎖定易受攻擊的實例

要觸發此漏洞,攻擊者必須識別一個指向Dubbo HTTP bean的URL。URL地址信息通常是公開或無需特權訪問即可獲得的,只要攻擊者通過Zookeeper等Dubbo服務注冊表以及多播就可以在網上獲得該URL地址,無須部署良好的HTTPS傳遞途徑,從而實現中間人攻擊。

觸發漏洞概念驗證

有關運行的概念驗證代碼,參加附件1。請注意,Dubbo實例的IP地址等變量需要在這段代碼中進行修改。

如上所述,攻擊者需要與Dubbo HTTP服務相同的依賴項。在此概念驗證中,com.nqzero:permit-reflect用于序列化期間所需的反射函數,而org.apache.httpcomponents.httpclient則被用于將惡意小工具發送到HTTP服務。為觸發這個漏洞,攻擊者使用Apache Dubbo和JDK的類空間中可用方法設計了新的小工具鏈。

此小工具鏈使用以下組件:

  • remoting.httpinvoker.HttpinvokerServiceExporter——這是反序列化入口點,對請求體進行反序列化處理。HashMaps的反序列化和通常的Java集合調用其值的插入法。在這種情況下,將調用HashMap.putVal(h,k,v)。
  • 兩個springframework.aop.target.HotSwappableTargetSource對象的一個HashMap,一個包含作為目標的JSONObject,另一個包含作為目標的com.sun.org.apache.xpath.internal.objects.XString對象
  • HotSwappableTargetSource對象總是返回相同的hashcode (class.hashCode()),這迫使putVal(h,k,v)對HashMap鍵運行更深層次的相等性檢查,在其內容上觸發equals()——兩個HotSwappableTargetSource成員對象
  • HotSwappableTargetSource相等性檢查驗證HotSwappableTargetSource內的目標對象是否相等;在這種情況下:一個XString和一個JSONObject
  • equals(object)會觸發一個與this.toString().equals(object.toString())對等的調用,觸發JSONObject.toString()
  • JSONObject – org.apache.dubbo.common.json.JSONObject是Dubbo中的一個不推薦使用的類,用于處理JSON數據。如果調用toString(),超級方法JSON.toJSONString()將被調用。
  • 一個toJSONString()調用將嘗試使用JSONSerializer,調用序列化程序將對象序列化為JSON。此序列化程序是使用ASMSerializerFactory生成的。該工廠試圖序列化存儲在JSONObject中的對象中的所有getter法。
  • TemplatesImpl partial gadget ——這種已知的小工具被ysoserial和marshalsec中的許多小工具鏈使用。這個小工具會生成惡意的sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl對象。如果調用該對象的newTransformer()方法,該鏈將執行java.lang.Runtime.getRuntime().exec(command)
  • 由于toJSONString試圖序列化所有的getter方法,所以TemplatesImpl.getOutputProperties()也被調用了
  • 在內部,getOutputProperties()方法調用newTransformer(),從生成的轉換器獲取屬性

image003

圖3–利用字節碼

如果調用了newTransformer,

HttpInvokerServiceExporter.doReadRemoteInvocation(ObjectInputStream ois)

和java.lang.Runtime.getRuntime().exec(command)之間的反序列化流程就完成了,從而實現遠程代碼執行。

最終小工具鏈的結構如下:

如果該漏洞被觸發,并且惡意代碼被執行(在概念驗證中,服務器上會彈出一個calc.exe實例),就會引發異常。然而,應用程序將繼續按照預期的方式運行,從而穩定地利用給定的小工具鏈。

image005

圖4–概念驗證結果

為什么會發生這種情況?

當在Spring框架上使用HTTP協議創建Dubbo應用程序時,就會出現使用HTTP遠程處理的Apache Dubbo。Dubbo毫無防備地在Spring中調用一個已知存在漏洞的類,并使用極易受攻擊(幾乎沒有防范能力)的ObjectInputStream反序列化用戶輸入。攻擊者可以提供一個有效負載,當反序列化時,該有效負載將觸發一連串的對象和方法調用,如果在反序列化范圍內給定一個易受攻擊的小工具鏈,可能會導致遠程代碼執行,這將在本概念驗證中演示。

易受攻擊的Spring Remoting類是HttpInvokerServiceExporter。來自Spring文檔中:

警告:請當心不安全的Java反序列化導致的漏洞問題:在反序列化步驟中,被操縱的輸入流會導致服務器上不需要的代碼執行。因此,不要將HTTP調用方端點暴露給不可信的客戶端,而是只在您自己的服務之間公開。一般來說,我們強烈推薦采用任何其他消息格式替代(如JSON)。”

這正是Dubbo HTTP遠程處理所發生的情況。使用Dubbo HTTP遠程處理模塊,公開一個接收以下結構的HTTP請求的HTTP端點:

  • POST請求
  • 其URL是指提供商公開的bean的classname,它由Dubbo連接到實際的程序包和類
  • 其主體是對象的流,由ObjectOutputStream序列化

HttpProtocol處理程序使用HttpInvokerServiceExporter解析傳入的org.apache.dubbo.rpc.protocol.http.HttpRemoteInvocation對象,該對象在內部利用ObjectInputStream對其進行反序列化。HttpRemoteInvocation包含對某個方法的調用,以及該方法的傳遞參數。但是,使用ObjectInputStream,可以傳遞任何任意序列化的Java對象,然后以不安全的方式反序列化這些對象,從而導致不安全的反序列化。

ObjectInputStream本身沒有任何外部類,當它用于反序列化格式錯誤的嵌套對象時,容易受到內存耗盡和堆溢出攻擊。

如果允許代碼或命令執行的代碼范圍內有ObjectInputStream可反序列化小工具鏈,則攻擊者可以利用這一點來創建導致遠程代碼執行的對象。這樣一個小工具鏈被發現和利用。

受污染的代碼流

在Dubbo HTTP服務中,會發生以下情況:

  1. 通過用戶輸入調用JavaX HttpServlet
  2. 此輸入被傳遞給Dubbo遠程調度程序DispatcherServlet,該程序使用HttpProtocol中的內部類HttpHandler來處理請求并返回響應
  3. handle()在第210行創建不安全的HttpInvokerServiceExporter,并在第216行的請求中調用它
  4. 從那里,HttpInvokerServiceExporter中的內部調用最終將請求流傳遞到第115行的ObjectInputStream中,然后由第144行的處理程序的超類RemoteInvocationSerializingExporter在內部讀取
  5. 然后ObjectInputStream readObject操作觸發小工具鏈

開發所需的先驗知識

利用開放的HTTP端口訪問Dubbo HTTP Remoting服務所需知道的唯一內容就是遠程調用(Remote Invocation)接口的程序包和類的名稱。該信息用于創建URL,后者是序列化惡意對象必須提交的地方,這是標準Spring bean行為。舉例而言,如果遠程接口的程序包名稱為“org.apache.dubbo.demo”,而被遠程處理的接口名稱為“DemoService”,則攻擊者需要將由ObjectOutputStream序列化的對象發布到URL“http://domain:port/org.apache.dubbo.demo.DemoService”上。這些URL信息可以以下各種方法獲得:

  • 如果Dubbo使用Zookeeper作為注冊表,則用Zookeeper查詢可用的beans
  • 通過中間人攻擊觀察HTTP流量
  • 如果Dubbo使用多播查找服務,欺騙行為也是可能發生的(這未經測試)
  • 如日志服務等其他方式

執行攻擊不需要額外的信息。

應該注意的是,人們一般不會將URL路徑視為機密信息,但網絡攻擊者可以在所謂的不可知的URL路徑后面隱藏易受攻擊的網絡服務,通過隱蔽性的操作,對服務安全構成威脅。

時間軸和披露信息總結

Checkmarx研究團隊首次發現這個漏洞后,致力于找到能夠再現漏洞攻擊進程的方法。一旦證實攻擊者的漏洞攻擊方法,研究團隊就會負責任地將自己的研究發現告知Apache。

披露時間軸

  • 2019年8月13日——Checkmarx向security@apache.org提供完整的披露信息,將漏洞問題轉發給了security@dubbo.apache.org
  • 2019年9月6日——Apache,Dubbo團隊確認找到了問題
  • 2019年10月4日——Dubbo團隊對擬定解決的技術問題做出回應。Checkmarx通過進一步闡述問題,做出回應。在本次披露時間的背景下,這是Apache員工第一次提出技術問題,也是最后一次
  • 2019年11月24日——Apache一方未能在90天后發出提醒,且沒有發表任何言論
  • 2019年12月3日——在Checkmarx發布報告前,Apache申請了更多的時間,用于對這個問題進行重新評估。這一請求被批準,兩天后Apache確認將發布CVE,并公布適合的解決方案
  • 2020年2月11日——CVE-2019-17564通過dev@dubbo.apache.org郵件列表進行披露,披露時間是在首次披露后的六個月(180天)
  • 2020年2月12日——第一個POC在自然環境下出現,但它不包含本文中公開的新小工具鏈

程序包版本

org.apache.dubbo.dubbo – 2.7.3

org.apache.dubbo.dubbo-remoting-http – 2.7.3

org.springframework.spring-web – 5.1.9.RELEASE

供應商防范

Apache Dubbo團隊通過將FastJSON(含最新版本JSONObject)更新為項目依賴項中的最新版本,解決了這個問題,有效地打破了當前的枷鎖。他們還將HTTP協議使用的反序列化機制進行替換,變更了通信協議,確保這種特定的攻擊無法發揮作用。

結論

Dubbo HTTP Remoting服務容易受到未經認證的遠程代碼執行的攻擊。事實上,攻擊者除了需要知道URL的信息,不需要知道任何先驗知識就可以順利通過該漏洞對該服務進行攻擊。

造成這種漏洞問題的根本原因是系統使用了一個不安全的Spring類,HttpInvokerServiceExporter,用于綁定HTTP服務。該類使用標準的Java ObjectStream,并且沒有白名單類形式的安全機制,卻能讓反序列化允許調用其反序列化過程可能觸發惡意代碼的任意類。這時應該停止使用這個類,采用完善的解決方案替代,將DubboHTTP beans中的預期類列入白名單。

Checkmarx安全研究團隊持續開展這類研究活動旨在讓全球各地的企業都能在軟件安全實踐方面進行必要的變革,以努力提高所有人的整體安全防護級別。了解更多安全研究可以關注Checkmarx微信公眾號和官網。

附件1

附件1A:DubboGadget類

一個用于攻擊Dubbo HTTP實例的類

image006

image007

附件1B: Utils類

實用類,包括實用方法,用于創建惡意小工具鏈的某些部分,并通過簡化反射來公開某些函數。很大程度上,實用類源自Chris Frohoff系列文章中的輔助類和舒適方法——https://github.com/frohoff/ysoserial。此外,makeXStringToStringTrigger源自Moritz Bechler的前期研究,示例參見https://github.com/mbechler/marshalsec

image008

image009

image010

image011

附件1C:用于DubboGadget的pom.xml文件

DubboGadget的Maven依賴項

?image012

上一篇:構建5G時代“新基建 ” CDCE2020國際數據中心展設立“新基建主題專區”

下一篇:GeekPwn2020 新增“新基建”安全專項賽,助力產業數字化升級