Spring Cloud Gateway漏洞案例

wen java案例 3

本文目录导读:

Spring Cloud Gateway漏洞案例

  1. 案例一:CVE-2022-22947 — Spring Cloud Gateway SpEL 注入远程代码执行
  2. 案例二:CVE-2023-34033 — Gateway 的 Spring Security 绕过
  3. 案例三:CVE-2021-21341 — Gateway 的 Spring Cloud Function RCE 间接影响
  4. 防御最佳实践

Spring Cloud Gateway 历史上曾出现过几个高危漏洞,主要集中在 CVE-2022-22947(SpEL 注入)和 CVE-2023-20XXX(Actuator 导致的 RCE)等。

以下是几个典型的漏洞案例及详细分析:

CVE-2022-22947 — Spring Cloud Gateway SpEL 注入远程代码执行

这是 Spring Cloud Gateway 历史上影响最广、最严重的漏洞,存在于 3.1.0 和 3.0.6 之前的版本。

  • 漏洞类型:SpEL(Spring Expression Language)表达式注入。

  • 触发条件:攻击者可以访问 Gateway 的 Actuator 端点(如 /actuator/gateway/routes),并且该端点未做权限控制。

  • 攻击原理

    • Gateway 允许通过 Actuator API 动态创建和修改路由。
    • 路由的过滤器(Filter)部分,特别是 AddResponseHeaderRewritePath 等过滤器的参数,会使用 SpEL 解析。
    • 当攻击者通过 POST 请求创建一个新的路由时,可以在过滤器的参数中注入恶意的 SpEL 表达式。
    • 关键点:Gateway 在处理请求时,会自动解析这些参数中的 SpEL 表达式,导致恶意代码被执行。
  • 攻击步骤

    1. 扫描:攻击者扫描到开放的 Gateway Actuator 端点(http://target:8080/actuator)。
    2. 确认:访问 /actuator/gateway/routes,确认路由管理功能开启。
    3. 构造请求:发送一个 POST 请求创建一个新的路由,并在过滤器参数中注入 SpEL 代码,负载示例(用于执行系统命令):
      {
        "id": "hack_route",
        "filters": [{
          "name": "AddResponseHeader",
          "args": {
            "name": "Result",
            "value": "#{new String(T(java.lang.Runtime).getRuntime().exec('id').getInputStream().readAllBytes())}"
          }
        }],
        "uri": "http://localhost:8080"
      }
    4. 触发:访问任意路径,使 Gateway 匹配到这个新创建的路由。
    5. 结果:服务端执行 id 命令,输出结果(如 uid=0(root))会通过 HTTP 响应头返回给攻击者。
  • 影响:攻击者可以执行任意系统命令,完全控制服务器。

  • 修复建议:升级到 3.1.1+ 或 3.0.7+;或者如果不需要,关闭 Actuator 端点或使用 Spring Security 进行严格认证。


CVE-2023-34033 — Gateway 的 Spring Security 绕过

该漏洞主要影响 Spring Cloud Gateway 与 Spring Security(或 OAuth2)联合使用的场景,允许未认证的用户绕过安全配置访问受保护的 API。

  • 漏洞类型:认证绕过(Authentication Bypass)。

  • 触发条件

    • 使用 Spring Cloud Gateway 作为 API 网关。
    • 下游服务使用了 Spring Security 的 @EnableWebFluxSecurityServerHttpSecurity 配置。
    • Gateway 没有正确转发原始的认证上下文(SecurityContext)或对非标准 HTTP 方法处理不当。
  • 攻击原理

    • Gateway 在处理带有特殊字符(如换行符 %0d%0a)或非标准 HTTP 方法(如 PATCH 在某些配置下)的请求时,可能会导致路径解析不一致。
    • Gateway 认为请求路径是 /public/../admin/secret 并允许通过,但下游服务解析后认为实际路径是 /admin/secret,导致绕过安全过滤器。
    • 另一种情况是,Gateway 在转发请求时,丢失了 OAuth2 的 Bearer TokenCookie,导致下游服务误认为请求是未认证的,但如果 Gateway 配置了全局的 SecurityFilter,可能因为 order 顺序问题导致覆盖。
  • 攻击示例(简化):

    • 正常请求:GET /api/v1/admin/users — 要求 JWT Token。
    • 恶意请求:GET /api/v1/admin/users%0d%0a — 利用路径截断,Gateway 的路径匹配正则将其视为 /api/v1/admin/users + 换行,从而匹配了不需要认证的路由规则(如果存在)。
    • 或者:利用 HTTP 方法欺骗,发送 POST 到本应是 GET 的端点。
  • 影响:攻击者无需有效凭证即可访问受保护的资源,造成数据泄露或操作越权。

  • 修复建议:升级到有补丁的版本(3.1.7+);严格校验路由路径,避免使用通配符匹配到敏感路径;确保 Security Filter 的优先级正确。


CVE-2021-21341 — Gateway 的 Spring Cloud Function RCE 间接影响

虽然主要的 RCE 漏洞在 Spring Cloud Function 中,但 Spring Cloud Gateway 常作为前端集成,攻击者可以构造恶意的 spring.cloud.function.routing-expression 请求头,利用 Gateway 转发或直接命中 Function 服务。

  • 漏洞类型:RCE via SpEL。

  • 触发条件:Gateway 后端集成了 Spring Cloud Function。

  • 攻击原理

    1. 攻击者向 Gateway 发送请求,HTTP 头中包含 spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("calc")
    2. Gateway 将请求转发到下游的 Function 服务。
    3. Function 服务在处理请求时,解析了这个请求头中的 SpEL 表达式并执行。
  • 影响:RCE,完全控制 Function 服务。

  • 修复建议:升级 Spring Cloud Function 版本;在 Gateway 层面过滤或拦截危险请求头。


防御最佳实践

  1. 及时升级:使用最新稳定版(如 4.x 或 3.1.x 的最新小版本)。
  2. 关闭 Actuator:生产环境务必禁用 Gateway 的 Actuator 端点,或通过严格的网络安全策略(白名单)和 Spring Security 进行保护。
    management:
      endpoint:
        gateway:
          enabled: false
  3. 参数过滤:在自定义网关过滤器或全局过滤器(GlobalFilter)中,对可疑的 SpEL 表达式特征(如 、T()进行检测和拦截。
  4. 最小权限:Gateway 服务本身不要以 root 权限运行。
  5. 审计路由:定期检查动态路由,确保没有未授权的路由被创建。

抱歉,评论功能暂时关闭!