Spring Data Rest服务器PATCH请求远程代码执行漏洞技术分析与防护方案

近日,Pivotal官方发布通告表示Spring-data-rest服务器在处理PATCH请求时存在一个远程代码执行漏洞(CVE-2017-8046)。攻击者可以构造恶意的PATCH请求并发送给spring-date-rest服务器,提交的JSON数据中存在SPEL表达式可以导致远程代码执行。官方已经发布了新版本修复了该漏洞。

相关地址:

https://pivotal.io/security/cve-2017-8046

受影响的版本

  • Spring Data REST versions < 2.5.12, 2.6.7, 3.0 RC3
  • Spring Boot version < 2.0.0M4
  • Spring Data release trains < Kay-RC3

不受影响的版本

  • Spring Data REST 2.5.12, 2.6.7, 3.0RC3
  • Spring Boot 2.0.0.M4
  • Spring Data release train Kay-RC3

技术防护方案

用户自查

首先找到Spring Data Rest所在的目录,在Spring Data Rest根目录下找到pom.xml文件,用文本编辑器打开后找到<parent>标签,可获得当前说使用的spring版本。如果当前使用的Spring Data Rest版本在受影响的范围内,则说明存在漏洞风险。

官方修复方案

官方在新版本Spring Boot 2.0.0.M4,Spring Data REST 2.5.12, 2.6.7, 3.0RC3和Spring Data release train Kay-RC3中已经修复了该漏洞,请受影响的用户尽快升级,升级步骤如下:

1、首先找到Spring Data Rest所在的目录,用文本编辑器打开目录中的pom.xml文件,不同版本可能显示不同,请用户根据自己的产品版本更新版本号设置。

2. 清除maven中产生的项目,打开控制台,执行如下命令:mvn clean。
3. 重新运行服务,打开控制台,进入Spring Data REST目录,执行如下命令:mvn spring-boot:run。

参考链接:

https://projects.spring.io/spring-data-rest/

https://projects.spring.io/spring-boot/

绿盟科技防护建议

绿盟科技检测类产品与服务

  • 公网资产可使用绿盟云 紧急漏洞在线检测,检测地址如下:

https://cloud.nsfocus.com/#/krosa/views/initcdr/productandservice?page_id=12

2、内网资产可以使用绿盟科技的远程安全评估系统(RSAS V6)或 Web应用漏洞扫描系统(WVSS),以及入侵检测系统(IDS) 进行检测。

远程安全评估系统(RSAS V6)

http://update.nsfocus.com/update/listRsasDetail/v/vulweb

Web应用漏洞扫描系统(WVSS)

http://update.nsfocus.com/update/listWvss

入侵检测系统(IDS)

http://update.nsfocus.com/update/listIds

通过上述链接,升级至最新版本即可进行检测

使用绿盟科技防护类产品(IPS/IDS/NF/WAF)进行防护:

入侵防护系统(IPS)

http://update.nsfocus.com/update/listIps

下一代防火墙系统(NF)

http://update.nsfocus.com/update/listNf

Web应用防护系统(WAF)

http://update.nsfocus.com/update/wafIndex

通过上述链接,升级至最新版本即可进行防护!

临时解决方案

可以借助WAF产品禁用PATCH方法来进行临时防护,具体操作方法如下:

进入WAF Web管理页面,依次点击“安全管理”-“策略管理”-“HTTP访问控制”-“新建”。

在动作选项处选择“阻断”,源IP封禁处选择“不禁封”。

再勾选HTTP方法,设置为不属于。

点击确定后,即可创建策略。

技术分析

补丁分析

从官方的描述来看就是就是Spring-data-rest服务处理PATCH请求不当,导致任意表达式执行从而导致的RCE。

首先来看下补丁,主要是evaluateValueFromTarget添加了一个校验方法verifyPath,对于不合规格的path直接报异常退出,主要是property.from(pathSource,type)实现,基本逻辑就是通过反射去验证该Field是否存在于bean中。

程序验证复现

直接拉取https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples,找到spring-rest-data这个项目,直接用IDEA一步步导入进去即可,直接运行就能看到在本地的8080端口开启了jetty服务。但是请注意这编译好的是最新版本,要引入漏洞,当然得老版本,修改pom.xml

添加plugin,具体如下:

从项目test目录找到相关请求,发送http://127.0.0.1:8080/api/cities/1即可看到回显表明服务正常启动。测试程序验证的效果如下:

随便拿一个以前spring 表达式注入作为path的参数值,会报如下错误:

说明path参数确实被污染,此处存在表达式注入漏洞,虽然已经进入表达式的执行流程,但是这里却报错退出。

RCE分析

现在的poc离真正的RCE还差一步,查看org.springframework.expression.spel.ast.SpelNodeImpl.setValue方法。

这个方法直接抛出异常,那看来poc离执行还有一段距离。直接调出setValue的实现,发现有五个地方实现了,前面也看到了SpelNodeImpl的setValue是直接抛出异常的。查看他们的实现,只有CompoundExpression,Indexer,PropertyOrFieldReference真正存在执行表达式。

查看相关文档得知 CompoundExpression是复杂表达式,用.连接起来的都算。Indexer一般是这么表示test[xxlegend],通过将程序验证进行修改,发现也是可以运行的,再看调用栈也是符合我们刚才理解到:

在这个poc中还用到op参数,op表示要执行的动作,在代码中定义了add,copy,from,move,replace,test这么多操作值,add,test,replace可直接触发漏洞,并且test非常直接。下面看看test的调用栈:

可以看出来这个点官方没有修复,但是有个限制,evaluateValueFromTarget会报错退出,导致getValueFromTarget不会被执行,从而不会触发RCE。

声明

本安全公告仅用来描述可能存在的安全问题,绿盟科技不为此安全公告提供任何保证或承诺。由于传播、利用此安全公告所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,绿盟科技以及安全公告作者不为此承担任何责任。绿盟科技拥有对此安全公告的修改和解释权。如欲转载或传播此安全公告,必须保证此安全公告的完整性,包括版权声明等全部内容。未经绿盟科技允许,不得任意修改或者增减此安全公告内容,不得以任何方式将其用于商业目的。

关于绿盟科技

北京神州绿盟信息安全科技股份有限公司(简称绿盟科技)成立于2000年4月,总部位于北京。在国内外设有30多个分支机构,为政府、运营商、金融、能源、互联网以及教育、医疗等行业用户,提供具有核心竞争力的安全产品及解决方案,帮助客户实现业务的安全顺畅运行。

基于多年的安全攻防研究,绿盟科技在网络及终端安全、互联网基础安全、合规及安全管理等领域,为客户提供入侵检测/防护、抗拒绝服务攻击、远程安全评估以及Web安全防护等产品以及专业安全服务。

北京神州绿盟信息安全科技股份有限公司于2014年1月29日起在深圳证券交易所创业板上市交易,股票简称:绿盟科技,股票代码:300369。

如果您需要了解更多内容,可以
加入QQ群:570982169
直接询问:010-68438880

Spread the word. Share this post!

Meet The Author

Leave Comment