Spring最新原生无任何依赖RCE新链子
字数 972 2025-08-26 22:11:35
Spring最新原生无任何依赖RCE新链子分析
前言
本文详细分析了一种新型的Spring框架远程代码执行(RCE)漏洞利用链,该链子特点是无需任何外部依赖,完全基于Spring原生功能实现。该漏洞影响范围广,危害严重。
环境搭建
-
测试环境要求:
- Spring Framework 5.x
- JDK 8+
- 无需任何特殊依赖
-
搭建步骤:
// 基本Spring Boot应用 @SpringBootApplication public class VulnerableApp { public static void main(String[] args) { SpringApplication.run(VulnerableApp.class, args); } }
漏洞链分析
模块化机制的限制绕过
-
模块机制限制:
- Java 9+引入了模块化系统,限制了反射访问
- 传统利用方式在模块化环境下失效
-
绕过方法:
- 利用Spring内部的开放包(open packages)配置
- 通过
--add-opens参数自动开放关键模块
类加载问题解决
-
传统问题:
- 需要加载
AbstractTranslet等特殊类 - 高版本JDK中这些类被模块化保护
- 需要加载
-
新方案:
- 利用Spring自身的类加载机制
- 通过
BeanFactory间接加载恶意类
不继承AbstractTranslet的绕过技术
-
传统限制:
- 很多RCE链依赖继承
AbstractTranslet - 模块化后难以直接使用
- 很多RCE链依赖继承
-
新技术:
- 利用
EventListenerList触发toString调用 - 通过动态代理构造调用链
- 利用
详细利用链
Source点分析
-
入口点:
- Spring的XML解析功能
- 特别是
BeanDefinition的解析过程
-
关键代码:
BeanFactory factory = new XmlBeanFactory(new InputStreamResource(xmlPayload));
Getter调用链构造
-
利用原理:
- Spring的属性注入机制
- 通过嵌套属性访问触发方法调用
-
示例构造:
<bean id="malicious" class="java.lang.ProcessBuilder"> <property name="command"> <list> <value>calc.exe</value> </list> </property> </bean>
EventListenerList突破toString限制
-
技术细节:
EventListenerList的toString()会遍历所有监听器- 通过代理监听器构造方法调用链
-
关键步骤:
EventListenerList list = new EventListenerList(); list.add(SomeInterface.class, (SomeInterface) Proxy.newProxyInstance(...));
完整利用链
-
完整流程:
- 通过XML注入恶意Bean定义
- 构造
EventListenerList调用链 - 触发
toString()执行恶意代码 - 绕过模块化限制执行系统命令
-
防护建议:
- 禁用XML外部实体(XXE)
- 限制BeanFactory的XML来源
- 升级到最新Spring版本
总结
该RCE链的创新点在于完全基于Spring原生机制,不依赖任何第三方库,且能绕过Java模块化系统的限制。开发人员应及时评估应用风险并采取防护措施。