在安全角度来看外部来源的数据,均应视为不可信数据,对外部数据,其包含的所有信息都须经过校验或者过滤,再向下游服务进行传递。若无防护手段,攻击者可以通过构造恶意输入,对服务进行攻击。程序中如果使用未经校验的输入构造SpEL语句,就有可能造成SpEL表达式注入漏洞。部分SpEL表达式注入漏洞CVSS3.x 评分极高,nvd认定为高危漏洞,具有高致命性。
1 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引用,功能相对简单但是安全
2 SpEL表达式注入漏洞
历史报告的大部分SpEL漏洞大多涉及不受信任的用户输入的情况,恶意攻击者可能利用SpEL实现任意代码执行、拒绝服务等攻击,与SpEL相关的部分CVE漏洞见表 1。
表 1 部分SpEL注入CVE漏洞
CVE ID |
概述 |
评分cvss3.x |
CVE-2022-22963 |
在Spring Cloud Function 相关版本,存在SpEL表达式注入。恶意攻击者无需认证可通过构造特定的 HTTP 请求头注入 SpEL 表达式,最终执行任意命令,获取服务器权限。 |
9.8 |
CVE-2022-22980 |
Spring Data for MongoDB是 Spring Data 项目的一部分,该项目旨在为新的数据存储提供熟悉和一致的基于Spring的编程模型ÿ |