哈喽,大家好,我是强哥。
Spring Cloud Function现SPEL漏洞
近日,Spring Cloud Function 官方测试用例曝光了 Spring Cloud Function SPEL 表达式注入漏洞,可利用该漏洞通过注入SPEL 表达式来触发远程命令执行。
“由于Spring Cloud Function中RoutingFunction类的apply方法将请求头中的“spring.cloud.function.routing-expression”参数作为Spel表达式进行处理,造成了Spel表达式注入漏洞,攻击者可利用该漏洞远程执行任意代码。”
漏洞影响范围
3.0.0.M3 <= Spring Cloud Function <=3.2.2
什么是SPEL
Spring表达式语言(简称SpEl)是一个支持查询和操作运行时对象导航图功能的强大的表达式语言. 它的语法类似于传统EL,但提供额外的功能,最出色的就是函数调用和简单字符串的模板函数。尽管有其他可选的 Java 表达式语言,如 OGNL, MVEL,JBoss EL 等等,但 Spel 创建的初衷是了给 Spring 社区提供一种简单而高效的表达式语言,一种可贯穿整个 Spring 产品组的语言。这种语言的特性应基于 Spring 产品的需求而设计。
SPEL 漏洞
该漏洞的漏洞形态类似于命令注入,因此之前该漏洞归为命令注入类。看一下最简单的漏洞样例。
简单地说,就是我们可以通过请求参数设置命令来实现让目标主机执行我们传入的命令。
我们写一个可执行Spel的Controller
@RestController public class SpelController { @RequestMapping("/spel") @ResponseBody public String spel(String input){ SpelExpressionParser parser = new SpelExpressionParser(); Expression expression = parser.parseExpression(input); return Objects.requireNonNull(expression.getValue()).toString(); } }
上面的代码是直接获取到用户输入的参数,然后直接通过Spel表达式解析器解析执行。
然后,我们在浏览器中,输入如下地址:
http://127.0.0.1:8082/spel?input=new java.lang.ProcessBuilder("/System/Applications/Calculator.app/Contents/MacOS/Calculator").start()
我们可以看到,input参数的内容就是编写Java代码创建ProcessBuilder
类来生成本地进程。当我们的Controller获取到输入直接解析这份代码后,相当于执行了如下代码:
public static void main(String[] args) throws IOException { new java.lang.ProcessBuilder("/System/Applications/Calculator.app/Contents/MacOS/Calculator").start(); }
所以,我们在浏览器发起请求后,我们的机子就把计算器调用起来了
当然也可以采用T() 调用一个类的静态方法,它将返回一个 Class Object,然后再调用相应的方法或属性,也是可以实现相同的功能。
http://127.0.0.1:8082/spel?input=T(java.lang.Runtime).getRuntime().exec(%22open%20%2FSystem%2FApplications%2FCalculator.app%22)
本次漏洞原因
漏洞是出在SpringCloud Function的RoutingFunction功能上,其功能的目的本身就是为了微服务应运而生的,可以直接通过HTTP请求与单个的函数进行交互,同时为spring.cloud.function.definition参数提供你要调用的函数的名称。
就是在请求的headers头上添加一个spring.cloud.function.routing-expression参数,SpringCloud Function会直接将其参数内容直接带入到SPEL中查询,造成SPEL漏洞注入。
修复方式
目前Spring Cloud Function官方已发布此漏洞的补丁,但尚未正式发布修复版本,建议相关用户尽快应用补丁进行防护并关注官方的更新版本。
补丁下载链接:
下载链接:
强哥有话说
Spel表达式注入漏洞有一定的特殊性,正常在编写项目的过程中很难会使用到该功能,但它存在于大的框架项目中,因此一旦被挖掘出来其危害是很大的,除了spel还有很多类似的框架级表达式注入漏洞,就如之前的Log4j就是由JNDI导致的。
就在今天,Spring框架也曝出RCE 0day漏洞。已经证实由于 SerializationUtils#deserialize 基于 Java 的序列化机制,可导致远程代码执行 (RCE),使用JDK9及以上版本皆有可能受到影响。相关监测发现该漏洞可能已被远程攻击者利用,广东省网络安全应急响应中心连夜发布预警通知,考虑到Spring框架的广泛应用,FreeBuf对漏洞评级为:危险。
安全无小事。我们在日常的开发过程中,也要多注意在使用表达式注入,sql注入等问题。同时,多学习相关的安全知识,提升自己。