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表达式,导致任意代码执行。

漏洞触发点

  1. 路由表达式处理:Spring Cloud Function允许通过表达式动态路由函数调用
  2. 表达式解析:框架使用StandardEvaluationContext解析表达式,该模式允许执行任意Java代码
  3. 请求头注入:攻击者通过修改HTTP请求头注入恶意表达式

影响版本

  • 受影响版本:Spring Cloud Function 3.0.0.RELEASE - 3.2.2
  • 已修复版本:Spring Cloud Function 3.1.7+ 和 3.2.3+

漏洞复现

环境搭建

  1. 使用受影响版本的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

攻击效果

  1. 在Windows系统上弹出计算器
  2. 在Linux/Unix系统上可执行任意系统命令
  3. 可能导致服务器完全被控制

漏洞分析

核心问题代码

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);
        }
    };
}

关键问题

  1. 使用StandardEvaluationContext而非SimpleEvaluationContext
  2. 直接解析未经验证的用户输入
  3. 未对表达式内容进行任何限制

修复方案

官方修复

  1. 版本升级

    • 升级到Spring Cloud Function 3.1.7或更高版本
    • 升级到Spring Cloud Function 3.2.3或更高版本
  2. 修复措施

    • 默认禁用spring.cloud.function.routing-expression功能
    • 引入安全配置选项控制表达式解析行为

临时缓解措施

  1. 禁用路由表达式
spring.cloud.function.routing-expression.enabled=false
  1. Web安全配置
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .httpBasic();
    }
}
  1. 请求过滤
@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);
    }
}

安全开发建议

  1. 避免使用StandardEvaluationContext
// 不安全
StandardEvaluationContext context = new StandardEvaluationContext();

// 安全
SimpleEvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();
  1. 输入验证
public boolean isSafeExpression(String expression) {
    // 实现白名单验证逻辑
    return !expression.contains("T(") 
        && !expression.contains("Runtime")
        && !expression.contains("exec(");
}
  1. 最小权限原则
    • 以非特权用户身份运行应用
    • 限制应用的文件系统访问权限
    • 使用安全管理器限制敏感操作

检测方法

  1. 静态代码分析

    • 检查是否使用了StandardEvaluationContext
    • 检查是否直接解析用户提供的表达式
  2. 动态测试

    • 发送测试请求包含简单SPEL表达式如#{1+1}
    • 监控响应是否包含表达式计算结果
  3. 依赖检查

    • 使用OWASP Dependency-Check扫描项目依赖
    • 确认Spring Cloud Function版本不受影响

总结

Spring Cloud Function SPEL表达式注入漏洞是一个严重的安全问题,可能导致远程代码执行。开发人员应当:

  1. 立即升级到安全版本
  2. 审查代码中所有SPEL表达式使用场景
  3. 实施深度防御策略,包括输入验证、输出编码和最小权限原则
  4. 定期进行安全审计和渗透测试

通过采取这些措施,可以显著降低应用面临的安全风险,保护系统和数据不受攻击者侵害。

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创建简单应用: 攻击示例 发送恶意HTTP请求: 攻击效果 在Windows系统上弹出计算器 在Linux/Unix系统上可执行任意系统命令 可能导致服务器完全被控制 漏洞分析 核心问题代码 在 org.springframework.cloud.function.context.config.RoutingFunction 类中: 关键问题 使用 StandardEvaluationContext 而非 SimpleEvaluationContext 直接解析未经验证的用户输入 未对表达式内容进行任何限制 修复方案 官方修复 版本升级 : 升级到Spring Cloud Function 3.1.7或更高版本 升级到Spring Cloud Function 3.2.3或更高版本 修复措施 : 默认禁用 spring.cloud.function.routing-expression 功能 引入安全配置选项控制表达式解析行为 临时缓解措施 禁用路由表达式 : Web安全配置 : 请求过滤 : 安全开发建议 避免使用StandardEvaluationContext : 输入验证 : 最小权限原则 : 以非特权用户身份运行应用 限制应用的文件系统访问权限 使用安全管理器限制敏感操作 检测方法 静态代码分析 : 检查是否使用了 StandardEvaluationContext 检查是否直接解析用户提供的表达式 动态测试 : 发送测试请求包含简单SPEL表达式如 #{1+1} 监控响应是否包含表达式计算结果 依赖检查 : 使用OWASP Dependency-Check扫描项目依赖 确认Spring Cloud Function版本不受影响 总结 Spring Cloud Function SPEL表达式注入漏洞是一个严重的安全问题,可能导致远程代码执行。开发人员应当: 立即升级到安全版本 审查代码中所有SPEL表达式使用场景 实施深度防御策略,包括输入验证、输出编码和最小权限原则 定期进行安全审计和渗透测试 通过采取这些措施,可以显著降低应用面临的安全风险,保护系统和数据不受攻击者侵害。