本项目用于学习和验证 Spring Framework CVE-2022-22965,也就是 Spring4Shell 漏洞的影响条件、风险表现、修复方法和修复后复测流程。
项目在个人搭建的本地授权环境中完成。项目重点不是对真实目标进行攻击,而是通过搭建修复前和修复后的 Spring MVC 测试环境,逐项确认漏洞相关影响条件,并使用安全、可控的只读方式观察 Spring 数据绑定内部属性路径在版本升级前后的差异。
本项目完成了以下流程:
本项目仅用于个人本地自建环境或明确授权的安全测试环境。
项目不针对任何公网网站、服务器或第三方业务系统进行扫描、探测和漏洞利用,不包含真实用户数据和真实业务数据。
测试过程中未执行以下操作:
禁止将本项目中的测试方法用于任何未授权目标。
CVE-2022-22965 通常被称为 Spring4Shell,是 Spring Framework 中与请求参数数据绑定机制有关的远程代码执行漏洞。
Spring MVC 支持将 HTTP 请求参数自动绑定到 Java 对象属性中。例如,本项目通过以下方式接收姓名和邮箱参数:
@ModelAttribute("profile") UserProfile profile
正常情况下,请求参数 name 和 email 会根据属性名称绑定到 UserProfile 对象中。
在受影响版本中,对部分内部属性路径的访问限制不够严格。在使用 JDK 9 或更高版本,并满足特定 Servlet 容器、部署方式和数据绑定条件时,外部请求参数可能沿着普通业务对象继续访问 Java Class、模块、类加载器或容器相关的内部对象。
在特定可利用环境中,攻击者可能进一步修改服务器配置或写入服务器文件,从而形成远程代码执行风险。
本项目不执行完整远程代码利用,而是使用以下属性路径进行安全、只读的差异诊断:
class.module.name
本项目在个人本地 VMware 隔离实验环境中完成。
127.0.0.1正常功能测试数据:
Alice[email protected]安全诊断属性路径:
class.module.name
spring4shell-local-verification-lab/
README.md:项目介绍、测试思路、验证结果和修复说明docs/:Spring4Shell 本地影响条件验证、修复与复测报告images/:项目环境、测试过程和复测截图vulnerable-demo/:使用 Spring Framework 5.3.17 的修复前项目fixed-demo/:使用 Spring Framework 5.3.18 的修复后项目notes/:学习笔记和过程记录主要源码结构:
config/:Spring MVC 配置类和应用初始化类controller/:表单处理和属性路径诊断控制器model/:用于接收姓名和邮箱参数的 UserProfile 类WEB-INF/views/:首页、提交结果和诊断结果 JSP 页面本项目分别建立了修复前和修复后两个 Spring MVC 应用。
项目目录:
vulnerable-demo
使用版本:
Spring Framework 5.3.17
生成的 WAR 文件:
spring4shell-vulnerable-demo.war
访问地址:
http://127.0.0.1:8080/spring4shell-vulnerable-demo/
诊断页面:
http://127.0.0.1:8080/spring4shell-vulnerable-demo/binding-probe
项目目录:
fixed-demo
使用版本:
Spring Framework 5.3.18
生成的 WAR 文件:
spring4shell-fixed-demo.war
访问地址:
http://127.0.0.1:8080/spring4shell-fixed-demo/
诊断页面:
http://127.0.0.1:8080/spring4shell-fixed-demo/binding-probe
测试项目提供一个简单的用户资料表单,包含:
控制器通过以下方式接收请求参数:
@ModelAttribute("profile") UserProfile profile
当用户提交姓名和邮箱后,Spring MVC 会将 name 和 email 参数自动绑定至 UserProfile 对象。
结果页面会读取绑定后的对象,并显示用户提交的姓名和邮箱。
该功能用于确认项目能够正常运行,同时证明应用中存在有效的 Spring MVC 请求参数数据绑定入口。
本项目按照“先确认正常功能,再确认影响条件,之后进行只读风险诊断,最后修复并复测”的思路进行。
@ModelAttribute 将请求参数绑定至 UserProfile 对象。BeanWrapper 对 class.module.name 进行只读诊断。本项目对以下影响条件进行了逐项确认:
spring-webmvc 组件@ModelAttribute 的数据绑定入口修复前项目实际部署的 Spring 依赖包括:
spring-beans-5.3.17.jarspring-core-5.3.17.jarspring-web-5.3.17.jarspring-webmvc-5.3.17.jar本项目不会仅根据 Spring Framework 版本直接判断漏洞是否成立,而是结合 JDK、Spring MVC、Tomcat、WAR 部署和数据绑定入口进行综合分析。
为了避免执行具有破坏性的漏洞利用,本项目使用 Spring Framework 提供的 BeanWrapper 对以下属性路径进行只读检查:
class.module.name
该路径表示:
class:访问当前业务对象对应的 Java Class 对象module:访问该类所属的 Java 模块name:读取模块名称诊断过程只调用属性可读性检查和属性值读取方法:
因此,该诊断只能用于观察内部属性路径在修复前后的访问差异,不能单独证明已经实现远程代码执行。
修复前环境使用:
Spring Framework 5.3.17
检查属性路径:
class.module.name
诊断结果:
truenulltrue 表示当前环境可以沿着普通业务对象的 class 属性继续解析 module.name。
读取结果为 null,是因为当前 WAR 应用运行在 Java 未命名模块中,模块名称为空,不代表属性路径读取失败。
修复后环境使用:
Spring Framework 5.3.18
使用相同属性路径重新诊断:
class.module.name
诊断结果:
falseNot readable修复前后的结果形成明确对比:
该结果说明版本升级后,原诊断属性路径的访问已经受到限制,修复前观察到的风险表现不再出现。
本项目采用升级 Spring Framework 版本的方式进行修复。
修复前配置:
<spring.version>5.3.17</spring.version>
修复后配置:
<spring.version>5.3.18</spring.version>
修复过程中完成了以下操作:
fixed-demo。修复后项目实际部署的 Spring 依赖包括:
spring-beans-5.3.18.jarspring-core-5.3.18.jarspring-web-5.3.18.jarspring-webmvc-5.3.18.jar该结果证明修复版本已经被重新构建并实际部署,不是只修改了 pom.xml 中的版本号。
升级至 Spring Framework 5.3.18 后,重新访问修复项目首页并提交以下测试数据:
Alice[email protected]提交后,页面仍然正常显示:
Alice[email protected]该结果说明版本升级没有影响项目原有的正常请求参数绑定和页面显示功能。
Spring MVC 的自动数据绑定机制可以根据 HTTP 请求参数名称访问 Java 对象属性。
正常业务参数 name 和 email 只需要访问 UserProfile 中对应的普通属性。
但是,Spring 的属性访问机制还支持带点号的嵌套属性路径。在受影响版本中,对部分内部属性路径的限制不够严格,使外部参数在特定环境中可能从普通业务对象继续进入 Java Class、模块、类加载器或 Servlet 容器相关对象。
当内部对象存在能够影响服务器配置或文件系统的可写属性,并且应用同时满足 JDK、Tomcat、WAR 部署和数据绑定等条件时,可能进一步形成远程代码执行风险。
该漏洞不是因为 name 或 email 属性本身存在问题,也不是所有使用 Spring MVC 的项目都一定可以被利用。漏洞成立通常需要多个条件共同存在。
真实业务系统中建议采取以下措施:













本项目在本地隔离环境中完成了 Spring Framework CVE-2022-22965 的影响条件确认、风险表现诊断、版本升级修复和修复后复测。
修复前项目使用 Spring Framework 5.3.17。在 JDK 11、Spring MVC、Apache Tomcat 9.0.60 和传统 WAR 部署环境中,class.module.name 属性路径被判断为可以读取。
修复后项目将 Spring Framework 升级至 5.3.18。相同属性路径变为不可读取,同时姓名和邮箱的正常数据绑定功能仍然可以使用。
本项目没有执行完整远程代码利用,而是通过安全、可控的只读方法完成修复前后差异验证。
项目重点体现了以下能力: