Apache Struts2再曝远程代码执行漏洞,云安全带您一探究竟

举报
吾乃攻城猫喵大人 发表于 2017/09/07 11:28:46 2017/09/07
【摘要】 2017年9月5日,Apache Struts发布最新安全公告,Apache Struts2的REST插件存在远程代码执行的高危漏洞,该漏洞由lgtm.com的安全研究员汇报,漏洞编号为CVE-2017-9805(S2-052)。漏洞一出,华为云安全团队马上对最新漏洞做了全面的分析,对这个神秘又高危的漏洞一探究竟。

【前言】

         2017年9月5日,Apache Struts发布最新安全公告,Apache Struts2的REST插件存在远程代码执行的高危漏洞,该漏洞由lgtm.com的安全研究员汇报,漏洞编号为CVE-2017-9805(S2-052)。漏洞一出,华为云安全团队马上对最新漏洞做了全面的分析,对这个神秘又高危的漏洞一探究竟。

【漏洞概述

 影响版本

 2008之后的所有版本均受影响,所有使用该框架的RESTFUL API插件的网站均存在漏洞(官方2017年9月5日发布的Struts-2.5.13最新补丁版除外)。

 根因简介

插件中使用到的XStreamHanlder在对xml input(攻击者可控)进行反序列化处理之前,没有做任何安全过滤检查。

漏洞发现人

       发现人为LGTM(一个开源的代码分析工具)的一名员工,在利用QL(lgtm的一种查询语言)编写针对不安全的java反序列化检测发现的(稍微研究了下,其原理是利用了污点追踪的技术,讲道理Taint Tracking在二进制内存污点动态追踪和静态源码级的代码审计还是很6的)。

【漏洞分析】

基于源码patch对比的漏洞分析

首先根据官网的漏洞描述(https://struts.apache.org/docs/s2-052.html), 其中Problem描述:The REST Plugin is using a XStreamHandler with an instance of XStream for deserialization without any type filtering and this can lead to Remote Code Execution when deserializing XML payloads。简单的说,就是其中的一个REST插件在反序列化XML Payload的时候,利用了XStreamHandler这个类,而这个类的实例在反序列化前,没有对输入做任何的安全过滤,导致了悲剧。。。

        下面来看下Struts插件描述的配置

       struts插件描述xml配置

       struts-plugin.xml(path:"./src/plugins/rest/src/main/resources/struts-plugin.xml")

图一:struts插件描述xml配置

       上述配置文件中,针对xml的反序列化,利用了org.apache.struts2.rest.handler.XStreamHandler类

       接下来再看下这个XStreamHandler类的代码

XStreamHandler类源码分析

在Struts-2.5.13(2017年9月5日紧急补丁版本)之前的版本中(我们选取了2.5.10.1版本),其中XStreamHandler.java(path:"/src/plugins/rest/src/main/java/org/apache/struts2/rest/handler/XStreamHandler.java")中代码如下:

图二: XStreamHandler类源码(2.5.10.1版本)

一目了然,上述代码中,toObject方法为反序列化方法,但在整个反序列过程没有对Reader in的in参数做安全过滤检查,从而导致远程命令注入

Struts-2.5.13patch版本源码对比

我们对比了Struts-2.5.13(2017年9月5日紧急补丁版本)版本中的的XStreamHandler.java(path: "/src/plugins/rest/src/main/java/org/apache/struts2/rest/handler/XStreamHandler.java")的patch情况,部分代码如下:

图三: XStreamHandler类源码(2.5.13版本)

上述代码在之前版本的基础上,主要增加了两个方法addPerActionPermission和addDefaultPermissions,并在createXStream方法中,在实例化一个XStream()对象后,首先调用stream.addPermission(NoTypePermission.None)在擦除其现有的全部权限,然后调用上述两个方法添加action的授权和默认的授权。

【如何利用】

该漏洞与以往的java反序列化漏洞相比,利用简单,因为input,用户可控,因此只需要利用该REST API,POST 格式为xml的payload即可利用,具体的payload生成可利用该工具 https://github.com/mbechler/marshalsec

图四:漏洞复现

【如何防御?】

建议更新至struts-2.5.13版本,不过官网描述该版本可能会存在一点兼容问题。

而我们的华为云WAF安全团队(即web应用防火墙)已经紧急分析了该漏洞的攻击模式并提取了防御的特征规则。

【References】

https://struts.apache.org/docs/s2-052.html

https://struts.apache.org/announce.html#a20170905

http://archive.apache.org/dist/struts/2.5.10.1/struts-2.5.10.1-src.zip

http://ftp.tsukuba.wide.ad.jp/software/apache/struts/2.5.13/struts-2.5.13-src.zip

https://github.com/mbechler/marshalsec

https://lgtm.com/blog/apache_struts_CVE-2017-9805_announcement

https://lgtm.com/blog/apache_struts_CVE-2017-9805

本文作者by:九日可可

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。