天天看点

Struts2远程代码执行漏洞CVE-2017-9805 s2-052 绿盟科技发布分析和防护方案

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插件的相关配置

Struts2远程代码执行漏洞CVE-2017-9805 s2-052 绿盟科技发布分析和防护方案

从这个文件中就可以看出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反序列化的过程中带入一些有害类。

Struts2远程代码执行漏洞CVE-2017-9805 s2-052 绿盟科技发布分析和防护方案

目前公开的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的前缀是&lt;set&gt;.

Struts2远程代码执行漏洞CVE-2017-9805 s2-052 绿盟科技发布分析和防护方案

接着我们看下触发的执行调用栈:

Struts2远程代码执行漏洞CVE-2017-9805 s2-052 绿盟科技发布分析和防护方案

在xstreamhanler.toobject调用了xstream的fromxml,从而进入反序列化流程。

官方给出的缓解措施&lt;constant name="struts.action.extension" value="xhtml,,,json" /&gt;,从字面意思也能看出来,这个是针对action的后缀的,也就是说如果后缀不带xml也就可以绕过。操作方式如下:

将下图红框部分修改为:

&lt;constant name="struts.action.extension" value="xhtml,,json" /&gt;

Struts2远程代码执行漏洞CVE-2017-9805 s2-052 绿盟科技发布分析和防护方案

具体修改方法为:

使用压缩工具打开对应的jar包,这里以struts2-rest-plugin-2.5.10.1.jar为例:

Struts2远程代码执行漏洞CVE-2017-9805 s2-052 绿盟科技发布分析和防护方案

将struts-plugin.xml进行提取,修改对应的配置,重新放入压缩包中,替换原有配置:

Struts2远程代码执行漏洞CVE-2017-9805 s2-052 绿盟科技发布分析和防护方案

重启服务器即可。

停止xml解析后,再次访问xml请求时,应用就会显示404错误,不再支持xml格式数据的解析。

Struts2远程代码执行漏洞CVE-2017-9805 s2-052 绿盟科技发布分析和防护方案

下面给出测试用例,从我们的poc中也可以看出,post请求不带xml的后缀直接忽视这个缓解措施。xstream只跟content-type有关,如果content-type中含有xml,则会交给xstream处理,所以poc该怎么使还怎么使,下面看下我们的验证:

Struts2远程代码执行漏洞CVE-2017-9805 s2-052 绿盟科技发布分析和防护方案

从图上可以看出,我们已经去除了xml的支持,下面来看看payload的执行效果:

Struts2远程代码执行漏洞CVE-2017-9805 s2-052 绿盟科技发布分析和防护方案

成功弹出计算器,这也就验证了我们的想法。同时通过两个不同poc的比较,我们也能发现一些端倪,content-type支持xml的几种格式,post请求,put请求,get请求甚至是自定义请求都是能触发漏洞,我们可以将poc中&lt;map&gt;&lt;entry&gt;换成&lt;set&gt;也能触发漏洞。同时由于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 &amp;&amp; contenttype.contains("application/xml")) {

response.getwriter().write("reject!");

} else {

chain.dofilter(request, response);

}

添加该过滤器后,使用poc测试,可以拦截:

Struts2远程代码执行漏洞CVE-2017-9805 s2-052 绿盟科技发布分析和防护方案

需要注意的是,新版本使用的默认限制策略会导致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#

本文来自云栖社区合作伙伴安全加,了解相关信息可以关注安全加网站