2017年9月5日,apache struts釋出最新的安全公告,apache struts 2.5.x以及之前的部分2.x版本的rest插件存在遠端代碼執行的高危漏洞,漏洞編号為cve-2017-9805(s2-052)。漏洞的成因是由于使用xstreamhandler反序列化xstream執行個體的時候沒有任何類型過濾導緻遠端代碼執行。
相關位址:
https://struts.apache.org/docs/s2-052.html <a href="https://cwiki.apache.org/confluence/display/ww/s2-052">https://cwiki.apache.org/confluence/display/ww/s2-052</a>
受影響的版本
struts 2.1.2 – struts 2.3.33
struts 2.5 - struts 2.5.12
不受影響的版本
struts 2.3.34
struts 2.5.13
根據官方的描述資訊來看,是rest插件使用到xstreamhandler處理xml資料的時候,由于未對xml資料做任何過濾,在進行反序列将xml資料轉換成object時導緻的rce。
環境搭建好了之後,首先我們來看下rest插件的相關配置
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLul2Z1xGcwITJ0NXZy9CXt92Yu4GZkV3bsNmLix2ZuAjeuETbvNmLvFzarh3Nvw1LcpDc0RHaiojIsJye.png)
從這個檔案中就可以看出xstreamhanler就是content-type:xml的預設處理句柄,而且可以看出xml是預設支援格式,這也就是說存在rest插件就會存在xstream的反序列化漏洞。
接着看看官方的修複方案,更新檔位址:
<a href="https://github.com/apache/struts/commit/19494718865f2fb7da5ea363de3822f87fbda264">https://github.com/apache/struts/commit/19494718865f2fb7da5ea363de3822f87fbda264</a>
在官方的修複方案中,主要就是将xml中的資料白名單化,把collection和map,一些基礎類,時間類放在白名單中,這樣就能阻止xstream反序列化的過程中帶入一些有害類。
目前公開的poc是基于javax.imageio的,這是能直接本地執行指令,但是marshelsec提供了11個xstream反序列化庫,其中大部分都是基于jndi,具體包含:commonsconfiguration, rome, commonsbeanutils, serviceloader, imageio,
bindingenumeration, lazysearchenumeration, springabstractbeanfactorypointcutadvisor, springpartiallycomparableadvisorholder, resin, xbean,
從外部請求類完成反序列化。
下圖是一個簡單的驗證分析圖,從poc中可以看出,請求是put,請求的url字尾帶xml,請求的content-type為delicious/bookmark+xml,請求的xml的字首是<set>.
接着我們看下觸發的執行調用棧:
在xstreamhanler.toobject調用了xstream的fromxml,進而進入反序列化流程。
官方給出的緩解措施<constant name="struts.action.extension" value="xhtml,,,json" />,從字面意思也能看出來,這個是針對action的字尾的,也就是說如果字尾不帶xml也就可以繞過。操作方式如下:
将下圖紅框部分修改為:
<constant name="struts.action.extension" value="xhtml,,json" />
具體修改方法為:
使用壓縮工具打開對應的jar包,這裡以struts2-rest-plugin-2.5.10.1.jar為例:
将struts-plugin.xml進行提取,修改對應的配置,重新放入壓縮包中,替換原有配置:
重新開機伺服器即可。
停止xml解析後,再次通路xml請求時,應用就會顯示404錯誤,不再支援xml格式資料的解析。
下面給出測試用例,從我們的poc中也可以看出,post請求不帶xml的字尾直接忽視這個緩解措施。xstream隻跟content-type有關,如果content-type中含有xml,則會交給xstream處理,是以poc該怎麼使還怎麼使,下面看下我們的驗證:
從圖上可以看出,我們已經去除了xml的支援,下面來看看payload的執行效果:
成功彈出電腦,這也就驗證了我們的想法。同時通過兩個不同poc的比較,我們也能發現一些端倪,content-type支援xml的幾種格式,post請求,put請求,get請求甚至是自定義請求都是能觸發漏洞,我們可以将poc中<map><entry>換成<set>也能觸發漏洞。同時由于xstream本身的poc多達十一種,做好安全防禦确實比較艱難。
struts官方已經釋出了最新版本,請受影響的受用盡快更新來進行防護。
參考連結:
struts 2.3.34:
https://cwiki.apache.org/confluence/display/ww/version+notes+2.3.34
struts 2.5.13:
https://cwiki.apache.org/confluence/display/ww/version+notes+2.5.13
公網資産可使用綠盟雲 緊急漏洞線上檢測,檢測位址如下:
<a href="https://cloud.nsfocus.com/#/krosa/views/initcdr/productandservice?page_id=12">https://cloud.nsfocus.com/#/krosa/views/initcdr/productandservice?page_id=12</a>
内網資産可以使用綠盟科技的遠端安全評估系統(rsas v6)或 web應用漏洞掃描系統(wvss),以及入侵檢測系統(ids) 進行檢測。
遠端安全評估系統(rsas v6)
<a href="http://update.nsfocus.com/update/listrsasdetail/v/vulweb">http://update.nsfocus.com/update/listrsasdetail/v/vulweb</a>
web應用漏洞掃描系統(wvss)
<a href="http://update.nsfocus.com/update/listwvss">http://update.nsfocus.com/update/listwvss</a>
入侵檢測系統(nids)
<a href="http://update.nsfocus.com/update/listids">http://update.nsfocus.com/update/listids</a>
通過上述連結,更新至最新版本即可進行檢測
入侵防護系統(nips)
<a href="http://update.nsfocus.com/update/listips">http://update.nsfocus.com/update/listips</a>
下一代防火牆系統(nf)
<a href="http://update.nsfocus.com/update/listnf">http://update.nsfocus.com/update/listnf</a>
web應用防護系統(waf)
<a href="http://update.nsfocus.com/update/wafindex">http://update.nsfocus.com/update/wafindex</a>
通過上述連結,更新至最新版本即可進行防護!
添加xml過濾器,将所有的contenttype為“application/xml”的請求全部過濾。該方案會導緻所有contenttype為application/xml的請求失效,為暫時性的防護方案。
具體過濾器代碼如下:
public void dofilter(servletrequest request, servletresponse response, filterchain chain)
throws ioexception, servletexception {
if (request.getcontenttype() != null) {
string contenttype = request.getcontenttype().tolowercase(locale.english);
if (contenttype != null && contenttype.contains("application/xml")) {
response.getwriter().write("reject!");
} else {
chain.dofilter(request, response);
}
添加該過濾器後,使用poc測試,可以攔截:
需要注意的是,新版本使用的預設限制政策會導緻rest的一些函數停止工作,會對一些業務造成影響,建議使用以下新的接口:
org.apache.struts2.rest.handler.allowedclasses
org.apache.struts2.rest.handler.allowedclassnames
org.apache.struts2.rest.handler.xstreampermissionprovider
本安全公告僅用來描述可能存在的安全問題,綠盟科技不為此安全公告提供任何保證或承諾。由于傳播、利用此安全公告所提供的資訊而造成的任何直接或者間接的後果及損失,均由使用者本人負責,綠盟科技以及安全公告作者不為此承擔任何責任。綠盟科技擁有對此安全公告的修改和解釋權。如欲轉載或傳播此安全公告,必須保證此安全公告的完整性,包括版權聲明等全部内容。未經綠盟科技允許,不得任意修改或者增減此安全公告内容,不得以任何方式将其用于商業目的。
原文釋出時間:2017年9月6日
本文由:綠盟科技釋出,版權歸屬于原作者
原文連結:http://toutiao.secjia.com/struts2-cve-2017-9805-s2-052-protection#
本文來自雲栖社群合作夥伴安全加,了解相關資訊可以關注安全加網站