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应用和网络接口开发框架
核心概念
- IOC(控制反转):将对象创建权限统一管理,实现解耦
- Context:管理所有Bean的上下文环境
- Bean:Spring创建或管理的对象
- AOP(面向切面编程):统一处理MVC架构的衔接层
2. SpEL表达式语言
2.1 SpEL基础
SpEL(Spring Expression Language)是Spring的表达式语言,能够在运行时动态执行运算和指令。
使用方式:
- 注解中使用
- XML文件中使用
- 代码块中直接使用
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。
利用链:
- 攻击者发送包含恶意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的工作机制和安全风险
- 遵循最小权限原则
- 保持组件更新
- 实施纵深防御策略