Spring最新原生无任何依赖RCE新链子
字数 972 2025-08-26 22:11:35

Spring最新原生无任何依赖RCE新链子分析

前言

本文详细分析了一种新型的Spring框架远程代码执行(RCE)漏洞利用链,该链子特点是无需任何外部依赖,完全基于Spring原生功能实现。该漏洞影响范围广,危害严重。

环境搭建

  1. 测试环境要求:

    • Spring Framework 5.x
    • JDK 8+
    • 无需任何特殊依赖
  2. 搭建步骤:

    // 基本Spring Boot应用
    @SpringBootApplication
    public class VulnerableApp {
        public static void main(String[] args) {
            SpringApplication.run(VulnerableApp.class, args);
        }
    }
    

漏洞链分析

模块化机制的限制绕过

  1. 模块机制限制

    • Java 9+引入了模块化系统,限制了反射访问
    • 传统利用方式在模块化环境下失效
  2. 绕过方法

    • 利用Spring内部的开放包(open packages)配置
    • 通过--add-opens参数自动开放关键模块

类加载问题解决

  1. 传统问题

    • 需要加载AbstractTranslet等特殊类
    • 高版本JDK中这些类被模块化保护
  2. 新方案

    • 利用Spring自身的类加载机制
    • 通过BeanFactory间接加载恶意类

不继承AbstractTranslet的绕过技术

  1. 传统限制

    • 很多RCE链依赖继承AbstractTranslet
    • 模块化后难以直接使用
  2. 新技术

    • 利用EventListenerList触发toString调用
    • 通过动态代理构造调用链

详细利用链

Source点分析

  1. 入口点

    • Spring的XML解析功能
    • 特别是BeanDefinition的解析过程
  2. 关键代码

    BeanFactory factory = new XmlBeanFactory(new InputStreamResource(xmlPayload));
    

Getter调用链构造

  1. 利用原理

    • Spring的属性注入机制
    • 通过嵌套属性访问触发方法调用
  2. 示例构造

    <bean id="malicious" class="java.lang.ProcessBuilder">
      <property name="command">
        <list>
          <value>calc.exe</value>
        </list>
      </property>
    </bean>
    

EventListenerList突破toString限制

  1. 技术细节

    • EventListenerListtoString()会遍历所有监听器
    • 通过代理监听器构造方法调用链
  2. 关键步骤

    EventListenerList list = new EventListenerList();
    list.add(SomeInterface.class, (SomeInterface) Proxy.newProxyInstance(...));
    

完整利用链

  1. 完整流程

    • 通过XML注入恶意Bean定义
    • 构造EventListenerList调用链
    • 触发toString()执行恶意代码
    • 绕过模块化限制执行系统命令
  2. 防护建议

    • 禁用XML外部实体(XXE)
    • 限制BeanFactory的XML来源
    • 升级到最新Spring版本

总结

该RCE链的创新点在于完全基于Spring原生机制,不依赖任何第三方库,且能绕过Java模块化系统的限制。开发人员应及时评估应用风险并采取防护措施。

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