Spring4Shell 是什么
CVE-2022-22965(业内称 Spring4Shell)是 Spring Framework 在特定部署条件下的数据绑定问题:当应用以特定方式打包部署、且接口把用户输入绑定到对象属性时,攻击者可以通过构造参数访问到类加载器相关的属性,进而写入文件并最终执行代码。它的特殊性在于「条件依赖」——并非所有使用 Spring 的应用都受影响,与 JDK 版本、打包方式(WAR 部署在 Servlet 容器中等)密切相关,因此处置时要先判断自身部署形态,再决定升级优先级。
基本信息
| CVE 编号 | CVE-2022-22965 |
|---|---|
| 影响范围 | Spring Framework <5.3.18、<5.2.20(需满足特定条件) |
| 修复 | 升级到 5.3.18 / 5.2.20 或更高 |
| 缓解 | 数据绑定拒绝 class 相关敏感字段 |
| 排查 | 列出所有 Spring 应用的框架版本与部署形态 |
| 前后条件 | 与 JDK 版本和打包部署方式相关,需按实际环境判断 |
处置步骤
- 清点所有使用 Spring Framework 的应用与其版本
- 判断部署形态与 JDK 版本,确认是否落在受影响条件内
- 升级到修复版本,使用 BOM 统一管理依赖版本
- 无法立即升级时先应用官方建议的绑定限制缓解措施
- 验证:确认运行进程加载的框架版本已更新,并回归关键接口
- 记录:把版本、部署形态与验证结论挂回编号,便于审计
版本检查
版本检查
grep -R "spring-webmvc\|spring-core" pom.xml build.gradle
grep -R "spring.version" -n . | head
# 运行进程侧核对:确认实际加载的 JAR 版本
# 使用 Spring Boot 时注意 BOM 版本:spring-boot-dependencies 决定实际引入版本官方缓解(参数绑定限制)
官方缓解(参数绑定限制)
@ControllerAdvice
public class BindingControllerAdvice {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setDisallowedFields("class.*", "Class.*", "*.class.*", "*.Class.*");
}
}
// 该措施是临时缓解,升级框架版本仍是根治手段
// 部署后回归接口参数绑定功能,确认正常字段未受影响处置方式对照
| 方式 | 适用情况 | 局限 |
|---|---|---|
| 升级框架 | 所有可升级场景 | 需回归测试与发布窗口 |
| 绑定限制缓解 | 无法立即升级 | 临时手段,按需跟踪到升级完成 |
| 出站与 WAF 规则 | 争取时间的补充 | 规则覆盖有限,不能作为长期方案 |
仅部分部署形态受影响;即便如此也建议升级,后续版本还包含其他加固。