本文目录导读:

- 案例一:CVE-2022-22947 — Spring Cloud Gateway SpEL 注入远程代码执行
- 案例二:CVE-2023-34033 — Gateway 的 Spring Security 绕过
- 案例三:CVE-2021-21341 — Gateway 的 Spring Cloud Function RCE 间接影响
- 防御最佳实践
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)部分,特别是
AddResponseHeader、RewritePath等过滤器的参数,会使用 SpEL 解析。 - 当攻击者通过 POST 请求创建一个新的路由时,可以在过滤器的参数中注入恶意的 SpEL 表达式。
- 关键点:Gateway 在处理请求时,会自动解析这些参数中的 SpEL 表达式,导致恶意代码被执行。
-
攻击步骤:
- 扫描:攻击者扫描到开放的 Gateway Actuator 端点(
http://target:8080/actuator)。 - 确认:访问
/actuator/gateway/routes,确认路由管理功能开启。 - 构造请求:发送一个 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" } - 触发:访问任意路径,使 Gateway 匹配到这个新创建的路由。
- 结果:服务端执行
id命令,输出结果(如uid=0(root))会通过 HTTP 响应头返回给攻击者。
- 扫描:攻击者扫描到开放的 Gateway Actuator 端点(
-
影响:攻击者可以执行任意系统命令,完全控制服务器。
-
修复建议:升级到 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 的
@EnableWebFluxSecurity或ServerHttpSecurity配置。 - Gateway 没有正确转发原始的认证上下文(
SecurityContext)或对非标准 HTTP 方法处理不当。
-
攻击原理:
- Gateway 在处理带有特殊字符(如换行符
%0d%0a)或非标准 HTTP 方法(如PATCH在某些配置下)的请求时,可能会导致路径解析不一致。 - Gateway 认为请求路径是
/public/../admin/secret并允许通过,但下游服务解析后认为实际路径是/admin/secret,导致绕过安全过滤器。 - 另一种情况是,Gateway 在转发请求时,丢失了 OAuth2 的
Bearer Token或Cookie,导致下游服务误认为请求是未认证的,但如果 Gateway 配置了全局的SecurityFilter,可能因为order顺序问题导致覆盖。
- Gateway 在处理带有特殊字符(如换行符
-
攻击示例(简化):
- 正常请求:
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。
-
攻击原理:
- 攻击者向 Gateway 发送请求,HTTP 头中包含
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("calc")。 - Gateway 将请求转发到下游的 Function 服务。
- Function 服务在处理请求时,解析了这个请求头中的 SpEL 表达式并执行。
- 攻击者向 Gateway 发送请求,HTTP 头中包含
-
影响:RCE,完全控制 Function 服务。
-
修复建议:升级 Spring Cloud Function 版本;在 Gateway 层面过滤或拦截危险请求头。
防御最佳实践
- 及时升级:使用最新稳定版(如 4.x 或 3.1.x 的最新小版本)。
- 关闭 Actuator:生产环境务必禁用 Gateway 的 Actuator 端点,或通过严格的网络安全策略(白名单)和 Spring Security 进行保护。
management: endpoint: gateway: enabled: false - 参数过滤:在自定义网关过滤器或全局过滤器(GlobalFilter)中,对可疑的 SpEL 表达式特征(如 、
T()进行检测和拦截。 - 最小权限:Gateway 服务本身不要以 root 权限运行。
- 审计路由:定期检查动态路由,确保没有未授权的路由被创建。