导语:一、概述 8月22日,Apache软件基金会公开了Apache Struts中的一个高危远程代码执行漏洞。Apache Struts是一个流行的开源框架,用于以Java编程语言开发Web应用程序。该漏洞(CVE-2018-11776)由Semmle安全研究团队的Man Yue Mo发现并报告

一、概述

8月22日,Apache软件基金会公开了Apache Struts中的一个高危远程代码执行漏洞。Apache Struts是一个流行的开源框架,用于以Java编程语言开发Web应用程序。该漏洞(CVE-2018-11776)由Semmle安全研究团队的Man Yue Mo发现并报告,该团队主要致力于寻找开源软件中的高危漏洞。

根据漏洞严重程度,我们强烈建议使用了Struts的组织和开发人员立即升级Struts组件。在此前,曾经披露过类似的高危漏洞,结果漏洞利用方式也随之在1天内发布,对众多关键基础架构和客户数据都造成了威胁。

二、缓解方法

这一新的远程代码执行漏洞会影响Apache Struts2的所有版本,官方已于漏洞公布当日发布修复后版本及升级补丁。我们强烈建议使用Struts 2.3的用户及时升级到2.3.35版本,使用Struts 2.5的用户及时升级到2.5.17版本。该漏洞位于Apache Struts的核心部分,及时没有启用其他插件,使用Struts的所有应用都有可能受到攻击。

远程代码执行通常被认为是最严重的安全漏洞之一,因为这类漏洞允许攻击者控制易受攻击的系统。这样一来,攻击者就拥有了进入内部网络的突破口,从而使整个内部网络的基础架构和数据都处于风险之中。Struts应用程序通常面向公网,并且在大多数情况下,攻击者不需要任何已有特权来实现攻击。更糟糕的是,攻击者很容易判断某个应用程序是否存在相应漏洞,在漏洞爆出后,很可能攻击者能迅速编写专用的扫描工具。借助这些工具,恶意攻击者就能够快速地扫描出易受攻击的应用程序。

具体到Struts应用程序是否受到漏洞影响,要取决于应用程序的具体配置和体系结构。关于这部分的详细内容,请参阅本文下面的章节。需要提醒大家注意的是,即使应用程序当前不易受到攻击,但此后对Struts配置文件的一次无意更改,也可能导致应用程序易受攻击。因此,强烈建议用户对Struts组件进行升级。

三、Struts:被企业广泛使用的Web框架

Apache Struts被全球的企业广泛使用,统计数字表明,2017年,财富100强企业中至少有65%的企业依赖于使用Apache Struts框架构建的Web应用程序。此外,据估计,其中有57%的企业仍然下载了易受攻击的软件版本,继续创建新的Web应用。

不到一年前,Semmle安全研究团队宣布了一个类似的远程代码执行漏洞CVE-2017-9805。在该漏洞宣布的几天后,Equifax宣布由于他们未能及时修复此前爆出的CVE-2017-5638漏洞,导致包含1.47亿消费者的个人信息遭到泄露。据Equifax统计,此次泄密事件造成的损失超过6亿美元。

Struts在企业之中的普及程度与此类漏洞的潜在影响程度共同证明了这一漏洞所带来的威胁。

Semmle的副总裁Pavel Avgustinov是这样分析Struts漏洞的:

“我们此次公布的漏洞与此前Equifax的漏洞,这些都属于严重的远程代码执行漏洞。并且,Struts通常用于面向客户的网站,攻击者能够轻松识别易受攻击的系统,并且漏洞的利用较为简单。攻击者可以在几分钟内实现攻击,并从被入侵的系统中窃取数据,或者实现进一步的攻击。因此,立即修补存在漏洞的组件至关重要。如果选择等待,那么就要承担未尽责所带来的风险。”

四、漏洞发现过程

Semmle安全研究员Man Yue Mo发现了这个漏洞,他使用Semmle QL技术编写了支持深层语义代码分析的查询。 QL技术允许安全研究人员编写查询以搜索复杂的数据流路径。对于此漏洞,Semmle安全研究团队发现用户提供的输入在评估之前未经过充分验证,从而导致远程执行代码漏洞。

Man Yue Mo证实了他发现的这一漏洞的重要性:

“该漏洞影响Struts的常用终端,这些终端可能会被暴露,从而使得恶意攻击者找到攻入系统的突破口。漏洞的形成原因与Struts OGNL语言有关,此前发现的几个漏洞已经让攻击者对这种语言变得非常熟悉。总体来说,此次发现漏洞币Semmle安全研究团队去年9月发现并宣布的Struts远程代码执行漏洞更为严重。

关于Mo如何借助QL技术发现了这一漏洞,请阅读他的博客文章: https://lgtm.com/blog/apache_struts_CVE-2018-11776?__hstc=70225743.879974c8890f9f06c424e4ed7421532d.1535019582222.1535019582222.1535019582222.1&__hssc=70225743.1.1535019582222&__hsfp=2804021114 。关于CVE-2017-9805的漏洞详情,请阅读我们在去年发布的公告: https://lgtm.com/blog/apache_struts_CVE-2017-9805_announcement?__hstc=70225743.879974c8890f9f06c424e4ed7421532d.1535019582222.1535019582222.1535019582222.1&__hssc=70225743.1.1535019582222&__hsfp=2804021114

五、披露时间点

2018年4月10日:Man Yue Mo首次向Apache Struts安全团队通报此漏洞详情。

2018年6月25日:Apache Struts团队发布补丁,修复此漏洞。

2018年8月22日:Struts新版本发布(2.3.35和2.5.17),Apache Struts团队和Semmle安全研究团队共同发布公告。

六、漏洞详细分析

该漏洞是由于Struts框架核心部分中不受信任的用户数据验证不充分导致的。由于该漏洞位于Struts的核心,因此存在多种独立的攻击向量。目前,我们已经掌握了其中的两种攻击向量。

如果满足以下两个条件,则可以判断应用程序受到该漏洞的影响:

1、Struts配置中的alwaysSelectFullNamespace标志设置为True。需要特别注意的是,如果应用程序使用了流行的Struts Convention插件,那么会出现这种情况。

2、应用程序使用了在未指定命名空间(namespace)的情况下配置的动作(action),或者使用了通配符命名空间(例如“/*”)。这适用于Struts配置文件中指定的动作和命名空间(例如:<action namespace="main">),也同样适用于Java代码中指定的动作和命名空间(例如:在使用了Struts Convention插件的情况下)。

如果应用程序的配置符合上述两个条件,那么就非常容易受到以下攻击向量的攻击:

攻击向量1:未设置namespace值

经过测试,发现在没有命名空间的情况下,有3个Struts结果类型是不安全的。结果可以在Struts配置文件中定义,也可以在Java代码中定义(如果使用Struts Convention插件)。下面的3中结果类型易受攻击:

重定向动作(Redirect Action):将访问者重定向到其他URL,详情请参考Struts文档中关于redirectAction的部分(https://struts.apache.org/core-developers/redirect-action-result.html)。

动作链(Action Chaining):将多个动作链接到确定的序列或工作流的方法,详情请参考Struts文档中关于链的部分(https://struts.apache.org/core-developers/action-chaining.html)。

回传结果(Postback Result):将当前请求参数呈现为一个表单,该表单将立即回传提交到指定的目标链或回传中,详情请参考Struts文档中关于回传的部分(https://struts.apache.org/core-developers/postback-result.html)。

例如,以下struts.xml配置可能存在漏洞:

<struts>
  <package>
    <action name="a1">
      <result type="redirectAction">
        <param name="actionName">a2.action</param>
      </result>
    </action>
  </package>
</struts>

攻击向量2:在模板中使用url标签

Apache Struts支持Struts配置中<result>标记内的页面末班。如果从不提供命名空间属性的包(或特定通配符命名空间)引用模板,那么在这样的页面中使用url标签可能是不安全的。例如:

<package  namespace="/*">
  <action name="help">
    <result>/WEB-INF/help.jsp</result>
  </action>
</package>

Apache Struts配置的extract,制定了带有通配符命名空间规范的<package>,其中包含引用页面模板的<result>。

如果模板包含不含action或value属性的<s:url …>标签,那么应用程序则易受攻击。例如,以下<s:url …>标签(摘自Struts URL文档)容易受到攻击:

<s:url includeParams="get">
  <s:param name="id" value="%{'22'}" />
</s:url>

关于命名空间注入的更多信息

攻击者可以在HTTP请求中以参数的方式注入命名空间,并以此来对应用程序实现攻击。Struts框架对该参数的值没有进行充分验证,该值可以是任何OGNL字符串。

OGNL是一种功能强大的特定域语言,用于自定义Apache Struts的行为。

Semmle安全研究团队已经与Apache Struts团队发现了多个OGNL Payload,在此阶段,我们暂时无法公布有关该漏洞的更详细信息。

源链接

Hacking more

...