Spring Cloud Function SPEL表达式注入漏洞
字数 1558 2025-08-07 08:22:31
Spring Cloud Function SPEL表达式注入漏洞分析与防护指南
漏洞概述
Spring Cloud Function 是基于 Spring Boot 的函数计算框架,它抽象出所有传输细节和基础架构,允许开发人员保留所有熟悉的工具和流程,并专注于业务逻辑。该框架被曝出存在SPEL(Spring Expression Language)表达式注入漏洞,攻击者可通过构造恶意请求实现远程代码执行(RCE)。
漏洞原理
SPEL表达式注入机制
Spring Cloud Function在处理HTTP请求时,会将请求头中的spring.cloud.function.routing-expression参数值作为SPEL表达式进行解析。由于缺乏适当的输入验证和过滤,攻击者可以构造恶意的SPEL表达式,导致任意代码执行。
漏洞触发点
- 路由表达式处理:Spring Cloud Function允许通过表达式动态路由函数调用
- 表达式解析:框架使用
StandardEvaluationContext解析表达式,该模式允许执行任意Java代码 - 请求头注入:攻击者通过修改HTTP请求头注入恶意表达式
影响版本
- 受影响版本:Spring Cloud Function 3.0.0.RELEASE - 3.2.2
- 已修复版本:Spring Cloud Function 3.1.7+ 和 3.2.3+
漏洞复现
环境搭建
- 使用受影响版本的Spring Cloud Function创建简单应用:
@SpringBootApplication
public class FunctionApplication {
public static void main(String[] args) {
SpringApplication.run(FunctionApplication.class, args);
}
@Bean
public Function<String, String> uppercase() {
return value -> value.toUpperCase();
}
}
攻击示例
发送恶意HTTP请求:
POST /functionRouter HTTP/1.1
Host: vulnerable-app.com
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("calc")
Content-Type: text/plain
Content-Length: 4
test
攻击效果
- 在Windows系统上弹出计算器
- 在Linux/Unix系统上可执行任意系统命令
- 可能导致服务器完全被控制
漏洞分析
核心问题代码
在org.springframework.cloud.function.context.config.RoutingFunction类中:
private Function<Object, Object> functionFromExpression(String expression) {
FunctionRegistry functionRegistry = this.functionCatalog instanceof FunctionRegistry
? (FunctionRegistry) this.functionCatalog : null;
return new Function<Object, Object>() {
private final StandardEvaluationContext context = new StandardEvaluationContext();
private final ExpressionParser parser = new SpelExpressionParser();
@Override
public Object apply(Object input) {
this.context.setVariable("input", input);
if (functionRegistry != null) {
this.context.setVariable("functionRegistry", functionRegistry);
}
return this.parser.parseExpression(expression).getValue(this.context);
}
};
}
关键问题
- 使用
StandardEvaluationContext而非SimpleEvaluationContext - 直接解析未经验证的用户输入
- 未对表达式内容进行任何限制
修复方案
官方修复
-
版本升级:
- 升级到Spring Cloud Function 3.1.7或更高版本
- 升级到Spring Cloud Function 3.2.3或更高版本
-
修复措施:
- 默认禁用
spring.cloud.function.routing-expression功能 - 引入安全配置选项控制表达式解析行为
- 默认禁用
临时缓解措施
- 禁用路由表达式:
spring.cloud.function.routing-expression.enabled=false
- Web安全配置:
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.httpBasic();
}
}
- 请求过滤:
@Component
public class RequestFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
if (httpRequest.getHeader("spring.cloud.function.routing-expression") != null) {
throw new ServletException("Routing expressions are disabled");
}
chain.doFilter(request, response);
}
}
安全开发建议
- 避免使用StandardEvaluationContext:
// 不安全
StandardEvaluationContext context = new StandardEvaluationContext();
// 安全
SimpleEvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();
- 输入验证:
public boolean isSafeExpression(String expression) {
// 实现白名单验证逻辑
return !expression.contains("T(")
&& !expression.contains("Runtime")
&& !expression.contains("exec(");
}
- 最小权限原则:
- 以非特权用户身份运行应用
- 限制应用的文件系统访问权限
- 使用安全管理器限制敏感操作
检测方法
-
静态代码分析:
- 检查是否使用了
StandardEvaluationContext - 检查是否直接解析用户提供的表达式
- 检查是否使用了
-
动态测试:
- 发送测试请求包含简单SPEL表达式如
#{1+1} - 监控响应是否包含表达式计算结果
- 发送测试请求包含简单SPEL表达式如
-
依赖检查:
- 使用OWASP Dependency-Check扫描项目依赖
- 确认Spring Cloud Function版本不受影响
总结
Spring Cloud Function SPEL表达式注入漏洞是一个严重的安全问题,可能导致远程代码执行。开发人员应当:
- 立即升级到安全版本
- 审查代码中所有SPEL表达式使用场景
- 实施深度防御策略,包括输入验证、输出编码和最小权限原则
- 定期进行安全审计和渗透测试
通过采取这些措施,可以显著降低应用面临的安全风险,保护系统和数据不受攻击者侵害。