1 技术解读 | SpEL表达式注入漏洞分析、检查与防御-德赢Vwin官网 网
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

技术解读 | SpEL表达式注入漏洞分析、检查与防御

华为DevCloud 来源:未知 2023-03-25 07:55 次阅读

在安全角度来看外部来源的数据,均应视为不可信数据,对外部数据,其包含的所有信息都须经过校验或者过滤,再向下游服务进行传递。若无防护手段,攻击者可以通过构造恶意输入,对服务进行攻击。程序中如果使用未经校验的输入构造SpEL语句,就有可能造成SpEL表达式注入漏洞。部分SpEL表达式注入漏洞CVSS3.x 评分极高,nvd认定为高危漏洞,具有高致命性。


一、SpEL表达式介绍


Spring表达式语言(Spring Expression Language,SpEL)是 Spring Framework的核心技术之一,其支持在运行时查询和操作对象图。SpEL语法类似于Unified Expression Language,但提供了更加丰富的功能,最特别的是方法调用与字符串模板功能。SpEL主要支持以下功能:

  • 文字表达式

  • 布尔和关系运算符

  • 正则表达式

  • 类表达式

  • 访问properties, arrays, lists, maps

  • 方法调用

  • 关系运算符

  • 参数

  • 调用构造函数

  • Bean引用

  • 构造Array

  • 内嵌lists

  • 内嵌maps

  • 三元运算符

  • 变量

  • 用户定义的函数

  • 集合投影

  • 集合筛选

  • 模板表达式


SpEL功能强大,可以操作类和方法:

  • 引用方法:dog.run()

  • 引用静态方法:T(java.lang.Math).PI

  • 类实例化:使用new实例化对象,类名必须是全限定名,java.lang包内的除外如Integer、String等

  • 变量定义及赋值引用


在解析SpEL之后,获取表达式结果时,可以指定表达式的上下文对象:EvaluationContext

  • StandardEvaluationContext(默认):支持全套SpEL语言和功能配置选项,功能强大但存在隐患

  • SimpleEvaluationContext:仅支持SpEL语法的子集,不包括Java类型引用,构造函数和bean引用,功能相对简单但是安全


二、SpEL表达式注入漏洞


历史报告的大部分SpEL漏洞大多涉及不受信任的用户输入的情况,恶意攻击者可能利用SpEL实现任意代码执行、拒绝服务等攻击,与SpEL相关的部分CVE漏洞见表1。


表1部分SpEL注入CVE漏洞


常见的SpEL注入攻击流程如图 1所示,漏洞的基本条件有:1.使用StandardEvaluationContext;2. 未对输入的SpEL进行校验;3. 对表达式调用了getValue()或setValue()方法。当满足上述条件时,就给了攻击者可乘之机。


图1常见的SpEL注入攻击流程


三、漏洞实例


| 3.1CVE-2022-22963 Spring Cloud FunctionSpEL注入漏洞


|3.1.1基本信息

漏洞id:

CVE-2022-22963


漏洞简介:

在Spring Cloud Function 相关版本,存在SpEL表达式注入。恶意攻击者无需认证可通过构造特定的 HTTP 请求头注入 SpEL 表达式,最终执行任意命令,获取服务器权限。


漏洞发布地址:

https://nvd.nist.gov/vuln/detail/cve-2022-22963


漏洞安全级别:


漏洞代码仓地址:

https://github.com/spring-cloud/spring-cloud-function


漏洞补丁提交地址:

https://github.com/spring-cloud/spring-cloud-function/commit/0e89ee27b2e76138c16bcba6f4bca906c4f3744f


漏洞影响包版本:

3.0.0 <= Spring Cloud Function <= 3.2.2


|3.1.2Spring Cloud Function介绍


Spring Cloud Function 是基于 Spring Boot 的函数计算框架。它提供了一个通用的模型,用于在各种平台上部署基于函数的软件,包括像 Amazon AWS Lambda 这样的 FaaS(函数即服务,function as a service)平台。该项目致力于促进函数为主的开发单元,它抽象出所有传输细节和基础架构,并提供一个通用的模型,用于在各种平台上部署基于函数的软件。


|3.1.3CVE-2022-22963漏洞攻击路径


使用spring-cloud-function-web的Spring boot 应用,通过设置Message Headers来传达路由指令,也可以在请求头中指定spring.cloud.function.definition 或spring.cloud.function.routing-expression作为应用程序属性,允许使用 Spring 表达式语言。


当在application.properties中设置spring.cloud.function.definition=functionRouter从而将默认路由绑定具体函数由用户进行控制。


攻击者调用/functionRouter接口,并在请求头的spring.cloud.function.routing-expression中使用攻击性的SpEL语句,服务端就会解析SpEL并执行。


漏洞攻击图示如图 2所示。


图2CVE-2022-22963漏洞攻击路径


|3.1.4CVE-2022-22963漏洞修复方式


该漏洞主要从四处进行了修复:

(1)声明一个SimpleEvaluationContext,专用作来自header的SpEL的解析;

(2)新增一个布尔变量isViaHeader,用于标记当前Expression是否来自Header;

(3)如果是从Header中获取的spring.cloud.function.routing-expression表达式,isViaHeader为true ;

(4)isViaHeader为true时,expression.getValue指定使用headerEvalContext。

如图 3所示。


图3CVE-2022-22963漏洞修复


| 3.2CVE-2022-22980 Spring DataMongoDBSpEL表达式注入漏洞


|3.2.1基本信息

漏洞id:

CVE-2022-22980


漏洞简介:

Spring Data for MongoDB是 Spring Data 项目的一部分,该项目旨在为新的数据存储提供熟悉和一致的基于Spring的编程模型,同时保留存储的特定特征和功能。Spring Data MongoDB应用程序在对包含查询参数占位符的SpEL表达式使用@Query或@Aggregation注解的查询方法进行值绑定时,如果输入未被过滤,则容易受到SpEL注入攻击。


漏洞发布地址:

https://nvd.nist.gov/vuln/detail/CVE-2022-22980


漏洞安全级别:

高(CVSS3.x: 9.8)


漏洞代码仓地址:

https://github.com/spring-projects/spring-data-mongodb


漏洞补丁提交地址:

3.3.xhttps://github.com/spring-projects/spring-data-mongodb/commit/7c5ac764b343d45e5d0abbaba4e82395b471b4c43.4.xhttps://github.com/spring-projects/spring-data-mongodb/commit/5e241c6ea55939c9587fad5058a07d7b3f0ccbd3


漏洞影响包版本:

Spring DataMongoDB== 3.4.0 3.3.0 <= Spring Data MongoDB <= 3.3.4 其他不维护的老版本


漏洞时间线:


|3.2.2Spring Data forMongoDB介绍


Spring Data for MongoDB是Spring Data的一个子模块。目标是为MongoDB提供一个相近的一致的基于Spring的编程模型。其核心功能是映射POJO到Mongo的DBCollection中的文档,并且提供Repository 风格数据访问层。主要特性有:

  • Spring 配置支持:

    使用基于Java的@Configuration类或基于XML命名空间的配置来驱动Mongo实例和副本

  • MongoTemplate辅助类:

    可提高执行常见Mongo操作的效率,包括文档和POJO之间的集成对象映射

  • 异常处理:

    异常转换为Spring的可移植的数据访问异常层次结构

  • 功能丰富的对象映射与Spring的转换服务集成

  • 基于注释的映射元数据、并且可扩展以支持其他元数据格式

  • 持久化和映射生命周期事件

  • 使用MongoReader/MongoWrite 抽象的低级映射

  • 基于Java的查询、条件和更新DSL

  • Repository接口的自动实现,包括对自定义查询方法的支持

  • QueryDSL集成以支持类型安全的查询,以及地理空间整合

  • Map-Reduce集成

  • JMX管理和监控

  • 对存储库的CDI支持

  • GridFS支持


|3.2.3CVE-2022-22980漏洞攻击路径

图4CVE-2022-22980漏洞攻击路径


|3.2.4CVE-2022-22980复现


1)实验代码:learnjavabug

2)运行服务,com.threedr3am.bug.spring.data.mongodb.Application#main

3)Postman发送请求,如图5所示


图5Postman填写参数示例


4)现象:计算器程序被执行


|3.2.5CVE-2022-22980修复方式


Spring Data for MongoDB在修复此漏洞时,重新实现evaluator,指定EvaluationContext类型,如图 6所示。


图6CVE-2022-22980修复方式


四、检测与防御手段


(1)对于SpEL表达式注入漏洞漏洞,可以使用静态分析工具进行代码检查,可以有效规避部分问题。

(2)在此类场景中,对于用户输入,应当仔细校验,检查用户输入的合法性,保障其内容为正常数据。且在端侧与服务侧均应对用户数据进行校验,对非受信用户输入数据进行净化,避免用户输入任意内容。

(3)及时更新Spring Framework版本,避免因版本老旧而被利用的问题发生。

(4)使用源码静态分析工具进行白盒自动化检测,在代码合入阶段、静态分析监控阶段及时发现相关问题。


原文标题:技术解读 | SpEL表达式注入漏洞分析、检查与防御

文章出处:【微信公众号:华为DevCloud】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 华为
    +关注

    关注

    216

    文章

    34411

    浏览量

    251470

原文标题:技术解读 | SpEL表达式注入漏洞分析、检查与防御

文章出处:【微信号:华为DevCloud,微信公众号:华为DevCloud】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    详解nginx中的正则表达式

    前言,我这里验证的nginx-v1.23.2单机环境下的nginx中的正则表达式、location路径匹配规则和优先级。
    的头像 发表于 12-03 09:59 143次阅读
    详解nginx中的正则<b class='flag-5'>表达式</b>

    Verilog表达式的位宽确定规则

    很多时候,Verilog中表达式的位宽都是被隐式确定的,即使你自己设计了位宽,它也是根据规则先确定位宽后,再扩展到你的设计位宽,这常常会导致结果产生意想不到的错误。
    的头像 发表于 10-22 15:41 436次阅读
    Verilog<b class='flag-5'>表达式</b>的位宽确定规则

    通过工业智能网关实现中间变量表达式的快速配置

    ,出现告警可能是多个变量达到条件而触发的,就需要对中间变量进行配置。 对此,物通博联提供基于工业智能网关实现中间变量表达式的快速配置操作。用户可以根据生产现场的应用需求,灵活配置中间变量表达式,实现多参数、多条件
    的头像 发表于 10-08 17:10 237次阅读
    通过工业智能网关实现中间变量<b class='flag-5'>表达式</b>的快速配置

    nginx中的正则表达式和location路径匹配指南

    前言,我这里验证的nginx-v1.23.2单机环境下的nginx中的正则表达式、location路径匹配规则和优先级。
    的头像 发表于 09-29 16:02 711次阅读
    nginx中的正则<b class='flag-5'>表达式</b>和location路径匹配指南

    求助,以下恒流源电路Io的计算表达式怎么计算?

    这个恒流源电路Io的计算表达式怎么计算,求给出详细计算过程
    发表于 08-22 08:16

    TestStand表达式中常用的语法规则和运算符使用

    TestStand也有自己的语言嘛?在回答这个问题之前大家可以想一下在使用TestStand时有一个和语言密切相关的属性。没错那就是表达式(Expressions),在这篇文章中,小编将以Q&A的方式来带着大家来理解并熟悉TestStand表达式中较为常用的一些语法规则以
    的头像 发表于 08-15 18:10 1333次阅读
    TestStand<b class='flag-5'>表达式</b>中常用的语法规则和运算符使用

    Java表达式引擎选型调研分析

    1 简介 我们项目组主要负责面向企业客户的业务系统, 企业的需求往往是多样化且复杂的,对接不同企业时会有不同的定制化的业务模型和流程。 我们在业务系统中 使用表达式引擎,集中配置管理业务规则,并实现
    的头像 发表于 08-15 14:25 340次阅读
    Java<b class='flag-5'>表达式</b>引擎选型调研<b class='flag-5'>分析</b>

    鸿蒙原生应用元服务开发-仓颉基本概念表达式(二)

    三、do-while 表达式 do-while 表达式的基本形式为: do { 循环体 } while (条件) 其中“条件”是布尔类型表达式,“循环体”是一个代码块。do-while 表达式
    发表于 08-09 14:26

    鸿蒙原生应用元服务开发-仓颉基本概念表达式(一)

    不同操作,不会关注各分支最后一个表达式的值与类型,为了不让上述类型检查规则影响这一思维习惯,仓颉规定这种场景下的 if 表达式类型为 Unit、值为 (),且各分支不参与上述类型检查
    发表于 08-08 10:27

    求助,有关表达式选项卡(ADS)的问题求解

    你好。 我看不到表达式选项卡中的某些变量值。 数组的大小显然是 256,但我最多只能看到 100。 请问问题出在哪里? 谢谢。
    发表于 06-03 06:23

    mapgis属性筛选表达式

    篇文章中,我们将详细讨论MapGIS的属性筛选表达式,包括语法、操作符和函数等。 属性筛选表达式是一种在MapGIS中用于指定要素选择条件的代码。它由一组操作符、函数和属性字段组成,用于描述要筛选的要素的特征。在MapGIS中,属性筛选
    的头像 发表于 02-25 10:58 1610次阅读

    西门子博途的算术表达式

    算术表达式既可以是一个数字值,也可以是由带有算术运算符的两个值或表达式组合而成。 算术运算符可以处理当前 CPU 所支持的各种数据类型。如果在该运算中有 2 个操作数,那么可根据以下条件来确定结果的数据类型。
    的头像 发表于 01-24 11:36 1000次阅读

    你还不会gvim正则表达式?一文搞懂!

    gvim正则表达式常在命令行模式下使用,一般用于文本文件字符串的替换、删除等操作。
    的头像 发表于 01-19 16:47 1168次阅读

    rs触发器的逻辑表达式

    逻辑表达式是描述逻辑关系的符号表示,可以用于定义和描述各种电路和逻辑操作。在逻辑电路中,RS触发器是一种基本的存储器元件,也被称为锁存器。 RS触发器是由两个与门组成的,其输出互相连接,形成一个反馈
    的头像 发表于 01-12 14:09 3107次阅读

    全加器的逻辑表达式怎么推

    全加器是计算机中常用的一种逻辑电路,用于实现二进制加法运算。全加器接受两个输入位和一个进位位,并输出一个和位和一个进位位。它的逻辑表达式可以通过推导和分析得出。 首先,让我们回顾一下二进制加法的规则
    的头像 发表于 12-25 16:09 4341次阅读