Spring全家桶各类RCE漏洞浅析
字数 2552 2025-08-15 21:32:50

Spring全家桶RCE漏洞分析与防御指南

1. Spring框架概述

Spring全家桶包含多个关键组件:

  • Spring Framework:基础架构,包含Spring MVC、Spring Core、IOC和AOP等
  • Spring Boot:简化配置,内置Tomcat和默认XML配置
  • Spring Cloud:基于Spring Boot的分布式系统开发框架
  • Spring Security:鉴权和安全性框架
  • Spring MVC:Web应用和网络接口开发框架

核心概念

  1. IOC(控制反转):将对象创建权限统一管理,实现解耦
  2. Context:管理所有Bean的上下文环境
  3. Bean:Spring创建或管理的对象
  4. AOP(面向切面编程):统一处理MVC架构的衔接层

2. SpEL表达式语言

2.1 SpEL基础

SpEL(Spring Expression Language)是Spring的表达式语言,能够在运行时动态执行运算和指令。

使用方式

  1. 注解中使用
  2. XML文件中使用
  3. 代码块中直接使用

2.2 SpEL功能

  • 基本表达式:逻辑运算、三目运算、正则表达式
  • 类操作表达式:方法调用、属性引用、类实例化
  • 集合操作:字典访问、投影和修改
  • 模板表达式

2.3 SpEL示例

// 字符串操作
Expression exp = parser.parseExpression("'Hello '.concat('World')");

// 类操作(危险操作)
Expression exp = parser.parseExpression("T(Runtime).getRuntime().exec('calc.exe')");

// 集合操作
Expression exp = parser.parseExpression("{'sangfor', 'busyer', 'test'}");

2.4 SpEL执行上下文

  • SimpleEvaluationContext:安全,不包含危险操作
  • StandardEvaluationContext:危险,包含所有功能

3. 高危RCE漏洞分析

3.1 CVE-2018-1270

影响版本

  • Spring Framework 5.0 - 5.0.5
  • Spring Framework 4.3 - 4.3.15

漏洞描述
通过spring-messaging模块内存中STOMP代理创建WebSocket时,攻击者可发送恶意消息导致RCE。

利用链

  1. 攻击者发送包含恶意SpEL表达式的connect消息
  2. DefaultSubscriptionRegistry处理selector字段
  3. 使用StandardEvaluationContext解析表达式
  4. 后续send操作触发getValue执行代码

补丁:将StandardEvaluationContext替换为SimpleEvaluationContext

3.2 CVE-2018-1273

影响版本

  • Spring Data Commons 1.13 - 1.13.10
  • Spring Data REST 2.6 - 2.6.10
  • Spring Data Commons 2.0 - 2.0.5
  • Spring Data REST 3.0 - 3.0.5

漏洞描述
Spring Data Commons组件中处理用户输入时未过滤SpEL表达式,导致RCE。

利用链

  1. 攻击者构造恶意SpEL表达式作为参数
  2. MapPropertyAccessor处理参数
  3. 使用StandardEvaluationContext解析
  4. setValue触发执行

补丁:使用SimpleEvaluationContext替代StandardEvaluationContext

3.3 CNVD-2016-04742

影响版本

  • Spring Boot 1.1.0-1.1.12
  • Spring Boot 1.2.0-1.2.7
  • Spring Boot 1.3.0

漏洞描述
低版本Spring Boot处理500错误时递归解析嵌套SpEL表达式,message参数可控导致RCE。

利用链

  1. 触发500错误
  2. 错误处理解析${message}
  3. 递归解析嵌套SpEL表达式
  4. 执行任意代码

补丁:添加NonRecursivePropertyPlaceholderHelper限制二次解析

3.4 CVE-2017-8046

影响版本

  • Spring Data REST prior to 3.0.1
  • Spring Boot prior to 1.5.9

漏洞描述
PATCH方法局部更新时,path参数传入SpEL表达式导致RCE。

利用链

  1. 发送PATCH请求
  2. JsonPatchHandler处理path参数
  3. 实例化patchOperation并初始化SpEL解析器
  4. setValue触发执行

补丁:添加SpelPath类校验参数合法性

3.5 CVE-2017-4971

影响版本

  • Spring Web Flow 2.4.0 - 2.4.8

漏洞描述
配置view-state但未配置binder时,构造特殊HTTP请求可导致SpEL注入。

利用链

  1. 发送特殊构造请求
  2. 进入addDefaultMappings/addEmptyValueMapping
  3. 解析并执行SpEL表达式

补丁:使用BeanWrapperExpressionParser替换默认解析器

3.6 CNVD-2019-11630

影响版本

  • Spring Boot 1.x
  • Spring Boot 2.x

漏洞描述
通过env路径修改spring.cloud.bootstrap.location为恶意地址,refresh触发加载远程恶意配置。

利用链

  1. 修改bootstrap.location为恶意地址
  2. 触发refresh接口
  3. 加载远程yml文件
  4. 解析执行恶意代码

补丁:添加授权验证机制

4. 防御措施

  1. 及时升级:保持Spring组件为最新版本
  2. 上下文选择:优先使用SimpleEvaluationContext
  3. 输入验证:严格校验用户输入
  4. 最小权限:限制应用运行权限
  5. 配置安全
    • 禁用不必要的HTTP方法
    • 配置适当的CORS策略
    • 启用Spring Security
  6. 监控日志:监控异常请求和错误日志

5. 总结

Spring框架中的RCE漏洞多源于:

  1. 不安全的SpEL表达式解析
  2. 使用StandardEvaluationContext
  3. 未过滤的用户输入
  4. 递归解析风险

开发者应:

  • 了解SpEL的工作机制和安全风险
  • 遵循最小权限原则
  • 保持组件更新
  • 实施纵深防御策略
Spring全家桶RCE漏洞分析与防御指南 1. Spring框架概述 Spring全家桶包含多个关键组件: Spring Framework :基础架构,包含Spring MVC、Spring Core、IOC和AOP等 Spring Boot :简化配置,内置Tomcat和默认XML配置 Spring Cloud :基于Spring Boot的分布式系统开发框架 Spring Security :鉴权和安全性框架 Spring MVC :Web应用和网络接口开发框架 核心概念 IOC(控制反转) :将对象创建权限统一管理,实现解耦 Context :管理所有Bean的上下文环境 Bean :Spring创建或管理的对象 AOP(面向切面编程) :统一处理MVC架构的衔接层 2. SpEL表达式语言 2.1 SpEL基础 SpEL(Spring Expression Language)是Spring的表达式语言,能够在运行时动态执行运算和指令。 使用方式 : 注解中使用 XML文件中使用 代码块中直接使用 2.2 SpEL功能 基本表达式 :逻辑运算、三目运算、正则表达式 类操作表达式 :方法调用、属性引用、类实例化 集合操作 :字典访问、投影和修改 模板表达式 2.3 SpEL示例 2.4 SpEL执行上下文 SimpleEvaluationContext :安全,不包含危险操作 StandardEvaluationContext :危险,包含所有功能 3. 高危RCE漏洞分析 3.1 CVE-2018-1270 影响版本 : Spring Framework 5.0 - 5.0.5 Spring Framework 4.3 - 4.3.15 漏洞描述 : 通过spring-messaging模块内存中STOMP代理创建WebSocket时,攻击者可发送恶意消息导致RCE。 利用链 : 攻击者发送包含恶意SpEL表达式的connect消息 DefaultSubscriptionRegistry处理selector字段 使用StandardEvaluationContext解析表达式 后续send操作触发getValue执行代码 补丁 :将StandardEvaluationContext替换为SimpleEvaluationContext 3.2 CVE-2018-1273 影响版本 : Spring Data Commons 1.13 - 1.13.10 Spring Data REST 2.6 - 2.6.10 Spring Data Commons 2.0 - 2.0.5 Spring Data REST 3.0 - 3.0.5 漏洞描述 : Spring Data Commons组件中处理用户输入时未过滤SpEL表达式,导致RCE。 利用链 : 攻击者构造恶意SpEL表达式作为参数 MapPropertyAccessor处理参数 使用StandardEvaluationContext解析 setValue触发执行 补丁 :使用SimpleEvaluationContext替代StandardEvaluationContext 3.3 CNVD-2016-04742 影响版本 : Spring Boot 1.1.0-1.1.12 Spring Boot 1.2.0-1.2.7 Spring Boot 1.3.0 漏洞描述 : 低版本Spring Boot处理500错误时递归解析嵌套SpEL表达式,message参数可控导致RCE。 利用链 : 触发500错误 错误处理解析${message} 递归解析嵌套SpEL表达式 执行任意代码 补丁 :添加NonRecursivePropertyPlaceholderHelper限制二次解析 3.4 CVE-2017-8046 影响版本 : Spring Data REST prior to 3.0.1 Spring Boot prior to 1.5.9 漏洞描述 : PATCH方法局部更新时,path参数传入SpEL表达式导致RCE。 利用链 : 发送PATCH请求 JsonPatchHandler处理path参数 实例化patchOperation并初始化SpEL解析器 setValue触发执行 补丁 :添加SpelPath类校验参数合法性 3.5 CVE-2017-4971 影响版本 : Spring Web Flow 2.4.0 - 2.4.8 漏洞描述 : 配置view-state但未配置binder时,构造特殊HTTP请求可导致SpEL注入。 利用链 : 发送特殊构造请求 进入addDefaultMappings/addEmptyValueMapping 解析并执行SpEL表达式 补丁 :使用BeanWrapperExpressionParser替换默认解析器 3.6 CNVD-2019-11630 影响版本 : Spring Boot 1.x Spring Boot 2.x 漏洞描述 : 通过env路径修改spring.cloud.bootstrap.location为恶意地址,refresh触发加载远程恶意配置。 利用链 : 修改bootstrap.location为恶意地址 触发refresh接口 加载远程yml文件 解析执行恶意代码 补丁 :添加授权验证机制 4. 防御措施 及时升级 :保持Spring组件为最新版本 上下文选择 :优先使用SimpleEvaluationContext 输入验证 :严格校验用户输入 最小权限 :限制应用运行权限 配置安全 : 禁用不必要的HTTP方法 配置适当的CORS策略 启用Spring Security 监控日志 :监控异常请求和错误日志 5. 总结 Spring框架中的RCE漏洞多源于: 不安全的SpEL表达式解析 使用StandardEvaluationContext 未过滤的用户输入 递归解析风险 开发者应: 了解SpEL的工作机制和安全风险 遵循最小权限原则 保持组件更新 实施纵深防御策略