免费下载!由 O’Reilly 出版的《NGINX 完全指南》中文版已正式上线 了解详情
写点什么

最新 CVE 漏洞分析:SpEL- 被低估的“破坏之王”

  • 2020-04-02
  • 本文字数:1348 字

    阅读完需:约 4 分钟

最新CVE漏洞分析:SpEL-被低估的“破坏之王”

背景

最近 Spring 框架不大太平,接连爆出来多个 RCE 远程代码执行的 CVE 漏洞,其中有 CVE-2018-1270,CVE-2018-1273,通过对造成漏洞部分代码进行分析,发现都是因为滥用 SpEL 的 StandardEvaluationContext。

漏洞影响

攻击者可以在未获得授权的情况下,将精心制作的请求参数注入到存在该漏洞的服务器上,从而发起远程代码执行攻击。


受影响的范围


  • Spring Data Commons 1.13 - 1.13.10 (Ingalls SR10)

  • Spring Data REST 2.6 - 2.6.10 (Ingalls SR10)

  • Spring Data Commons 2.0 to 2.0.5 (Kay SR5)

  • Spring Data REST 3.0 - 3.0.5 (Kay SR5)

  • 更早的版本也会受到影响

SpEL

SpEL 是一门非常简单的表达式语言,但是功能或者权限来说太大了,因此这里如果表达式能够被外部污染,基本上都可以造成 RCE。


SpEL 的具体语法,我这里就不一一介绍了,详情参考官方文档。我这里只说两个能够被有效利用的点。


类型表达式


使用类型表达式还可以进行访问类静态方法及类静态字段。使用 T()来表示,其中类名必须是全称,java.lang 包除外。因此这里就出现了第一类 payload。



类实例化


创建一个 Java 类实例,和上面一样,类名要求是全称。因此这里可以产生第二类 payload。



变量和函数的使用


在表达式里面要是用变量或者函数,需要提前在 context 使用 setVariable 和 registerFunction 才能使用,因此初步看没有太大利用价值。其中有两个内置变量 #root 根对象,#this 代表 Context 对象。而在 CVE-2018-1273 的 Spring Data Commons 中,



context 在初始化的时候,没有传入根对象,但是后面显式调用了 setRootObject,因此 #root 为 Map 对象,利用价值不大,#this 为 StandardEvaluationContext 对象,方法比较多,还在研究中,感觉这里也能提取出一类 payload,未完待续。

SpEL 调试

我们在写出来 payload 后,需要校验一下 payload 是否有效,可以使用如下的代码快速进行校验。


实战分析

CVE-2018-1273


上面也贴出来部分造成漏洞的代码,现在把完整的代码贴出来,代码位于 org,springframework.data.web.MapDataBinder 类中,



propertyName 是攻击者可以控制的变量,但是代码中将它直接用来生成 Expression。但是在使用之前我们发现有一段代码进行 propertyName 的有效性校验,它用来判断实体类的 propertyName 属性是否可写。



但是经过我们对这个 isWritableProperty 函数的分析,我们发现这里存在一个逻辑问题。



这个函数会造成 propertyName 如果是 name 和 name[huangjacky]返回一个东西。


攻击 Exploit 的诞生


我们的演示程序中,实体类是这样定义的:



因此我们对应的 Exploit 就应该为:



不出意外的话,这个时候可爱的计算器就出来了。


修复建议

使用华为云 WAF 立即防护


华为云安全团队第一时间对漏洞进行分析,云端下发内置规则进行防护,用户只需要接入华为云 WAF 即可。


使用华为云漏洞扫描服务进行安全检测


华为云漏洞扫描服务根据华为云安全团队漏洞分析后提取出对用户网站无害的安全检测规则,有效帮助用户发现该漏洞。


升级代码框架


Spring Data Commons


2.0.x 的用户升级到 2.0.6


1.13.x 的用户升级到 1.13.11


Spring Data REST


2.x 用户升级到 2.6.11


3.x 用户升级到 3.0.6


Spring Boot


1.5.x 用户升级到 1.5.11


2.x 用户升级到 2.0.1


本文转载自 华为云产品与解决方案 公众号。


原文链接:https://mp.weixin.qq.com/s/ZZPVOO61ffC0ry6-V6vdWA


2020-04-02 14:371091

评论

发布
暂无评论
发现更多内容

腾讯大牛整合Java+spring5系统学习架构,神乎其技

小Q

Java 学习 编程 面试 spring 5

ONES 收购知名协作工具 Tower

万事ONES

团队协作 高效 研发管理工具 收购 资讯

想了解任务型对话机器人,我们先从自然语言理解聊起

华为云开发者联盟

人工智能 机器人 自然语言

关于binlog,这个参数能不能用?

Simon

MySQL Binlog

Linux平台中调试C/C++内存泄漏方法 (腾讯和MTK面试的时候问到的)

linux大本营

c++ Linux 后台开发 架构师

ONES 收购 Tower,五源资本合伙人对话两位创始人

万事ONES

项目管理 团队协作 ONES Tower 收购

一个真正0基础小白学习前端开发的心路历程

华为云开发者联盟

开发 开发小白 0基础

训练营第七周作业

大脸猫

极客大学架构师训练营

架构设计之路-1

Dnnn

架构师 代码规范

跨架构编程不再难,英特尔机器编程工具迎来重磅更新

新闻科技资讯

英特尔神经拟态生态系统发展和研究的最新进展

新闻科技资讯

《技术男征服美女HR》—Fiber、Coroutine和多线程那些事

太白上仙

Java 程序员 面试 后端 多线程

面试无忧:源码+实践,讲到MySQL调优的底层算法实现

996小迁

Java 架构 面试

IntelliJ IDEA 2020.3正式发布,年度最后一个版本很讲武德

YourBatman

IDEA 新特性 2020.3

国产电子表格Luckysheet后台也开源了!支持在线协作,一键docker私有部署

奇异石榴果

Java Excel SpreadJS 表格控件

给你一个亿的keys,Redis如何统计?

不才陈某

redis

《前端实战总结》之使用CSS3实现酷炫的3D旋转透视

徐小夕

css3 大前端 CSS小技巧

英特尔推动集成光电的发展,用于数据中心

新闻科技资讯

javascript开发后端程序的神器nodejs

程序那些事

Java 后端 nodejs koa 程序那些事

即使不会node.js,拖拽就可完成数据的可视化展示

华为云开发者联盟

node.js 数据 可视化

新闻|Babelfish使PostgreSQL直接兼容SQL Server应用程序

PostgreSQLChina

数据库 postgresql 开源

挑战赛 | 话题王者VS互动先锋(第一季)

InfoQ写作社区官方

话题讨论 热门活动

谁能阻止世纪互联星光?2020年第11期北京机房网络质量评测数据排行榜发布

博睿数据

1分钟解密:博睿大数据核心引擎Bonree Zeus六大优势

博睿数据

架构师训练营第 1 期 -week11

习习

微软最强 Python 自动化工具开源了!不用写一行代码!

星安果

Python 微软 自动化 自动化测试 playwright

【技术分享】浅谈RTC及Agora RTC SDK集成介绍

Hanson

加码线下,新荣耀“破题”场景经济

脑极体

性能压测

jorden wang

架构师训练营第 11 周课后练习

叶纪想

极客大学架构师训练营

英特尔发布第二代Horse Ridge低温量子控制芯片

新闻科技资讯

最新CVE漏洞分析:SpEL-被低估的“破坏之王”_文化 & 方法_华为云产品与解决方案_InfoQ精选文章