413
技術社區[雲棲]
CVE-2017-9805:Struts2 REST插件遠程執行命令漏洞(S2-052) 分析報告
一. 漏洞概述
2017年9月5日,Apache Struts 2官方發布一個嚴重級別的安全漏洞公告,該漏洞由國外安全研究組織lgtm.com的安全研究人員發現,漏洞編號為CVE-2017-9805(S2-052),在一定條件下,攻擊者可以利用該漏洞遠程發送精心構造的惡意數據包,獲取業務數據或服務器權限,存在高安全風險。
二. 漏洞基本信息
漏洞編號:
CVE-2017-9805
漏洞名稱:
Struts2 REST插件遠程執行命令漏洞(S2-052)
官方評級: **
嚴重
**漏洞描述:
當Struts2使用REST插件使用XStream的實例xstreamhandler處理反序列化XML有效載荷時沒有進行任何過濾,可以導致遠程執行代碼,攻擊者可以利用該漏洞構造惡意的XML內容獲取服務器權限。
漏洞利用條件和方式:
利用條件:使用REST插件並在受影響版本範圍內。
利用方式:攻擊者構建惡意數據包遠程利用。
漏洞影響範圍:
Struts 2.3.x全係版本(根據實際測試,2.3版本也存在該漏洞)
Struts 2.5 - Struts 2.5.12
三. 漏洞詳細分析信息
本次Struts2漏洞是因為它的一個REST插件struts2-rest-plugin.jar用到了XStreamHandler這個類,這個類對http請求中content-type是application/xml的,調用XStream進行處理,這裏先看一下汙點傳入,如圖:
然而漏洞真正存在域XStream中,觸發的根本在於javax.imageio.spi.FilterIterator類的next()會調用FilterIterator$Filter的filter(),然後javax.imageio.ImageIO$ContainsFilter的filter()方法中會用反射調用java.lang.ProcessBuilder().start()
之前github已經公開利用代碼,地址https://github.com/mbechler/marshalsec,上圖代碼隻不過是他的exp當中的一個payload而已,這裏我詳細分析一下,主要是利用javax.imageio.ImageIO$ContainsFilter這個內部類,我們先看下代碼,如圖:
這裏用反射將java.lang.ProcessBuilder().start()設置進入ContainsFilter對象裏,以待後麵漏洞觸發時調用
這裏用無參的constructor去newInstance對象,生成空對象,然後再用反射去填充對應屬性,實際上這裏就是對應xml中的每個dom屬性,根據代碼邏輯我們可以看出,這裏層層封裝最終放到nativeString對象的value屬性裏,然後繼續跟蹤代碼
最終將上麵NativeString的對象放到了HashMap裏,
最後對上麵return的那個hashMap做toXML序列化,然後就有了今天公開的exploit。
下麵分析漏洞觸發流程,漏洞觸發就是fromXML重組對象的過程了,如圖
XStream反序列化的邏輯,實際上是解析XML DOM重組對象的一個過程,如圖:
當解析到jdk.nashorn.internal.objects.NativeString這個類的時候,漏洞觸發,先看下此時的調用棧,如圖
這裏我們看到了熟悉的hashCode,這根groovy的反序列化利用類觸發邏輯類似。因為exp代碼中我們最終將NativeString對象最終放到了hashMap裏然後對hashMap進行序列化,所以當反序列化重組對象的時候,肯定會觸發hashCode邏輯。繼續跟蹤,這裏NativeString和Base64Data都屬於java未公開的代碼,官方未提供源碼,不過我們可以參考openjdk的源碼,如圖,先看NativeString,如圖
這裏value是前麵封裝的Base64Data的對象,後麵進入Base64Data的邏輯,如圖:
這裏對應依次解析xml中的dataHandler、XmlDataSource的對象,從中取出CipherInputStream的對象,同理依次解析,最終在重組javax.imageio.spi.FilterIterator對象的時候觸發漏洞,這裏看一下利用代碼,如圖:
這裏cfCons.newInstance(ProcessBuilder.class.getMethod("start"), "foo")被設置為FilterIterator的filter,因為javax.imageio.spi.FilterIterator類的next()會調用FilterIterator$Filter的filter()函數,而此時FilterIterator$Filter正是javax.imageio.ImageIO$ContainsFilter,這裏我們在javax.imageio.ImageIO$ContainsFilter的filter()下斷,代碼如圖
這裏的method是正是ProcessBuilder().start()方法,此時調用棧如圖:
四. 如何檢測漏洞?
如果您是運維人員或開發人員,建議您盡快關注並資產,您可以檢查使用了REST插件Struts版本是否在受影響範圍內,如果存在建議您盡快按照以下方式修複漏洞。
五. 如何規避漏洞風險?
- 目前官方已經發布補丁,建議升級到 Apache Struts2.5.13版本;
- 編輯 struts.xml ,禁用REST插件或限製xhtml和json格式文件。
- 阿裏雲雲盾WAF已發布該漏洞規則,您也可以選用WAF對利用該漏洞的攻擊行為進行檢測和防禦,以規避安全風險。
六. 參考信息
七. 技術支持
最後感謝阿裏巴巴安全專家柏通的技術支持。
最後更新:2017-09-06 22:02:32
上一篇:
人工智能時代的產品思維(2C)
下一篇:
【雲周刊】第138期:專訪iDST華先勝:城市大腦,對城市的全量、實時認知和搜索
oracle錯誤備忘(ORA-00354,ORA-00353和ORA-00312的處理方法)
JUnit源碼分析(四)——從Decorator模式說起
AutoCAD:ObjectARX所有版本下載地址
android 滑動菜單SlidingMenu的實現
央視《新聞調查》:為什麼阿裏巴巴唿籲“像治理酒駕一樣打假”
Jquery中BlockUI的詳解
java定時器 從某時起每幾小時跑一次程序
不以規矩不成方圓:Digital Ocean也刪除了他們的數據庫
Javascript頁麵打印的頁眉頁腳的清除與設置
Kafka詳解五、Kafka Consumer的底層API- SimpleConsumer