CVE-2022-22965critical
Spring4Shell(Spring Framework 数据绑定)
Spring Framework 5.3.0-5.3.17 等版本在 JDK 9+ 下,攻击者可通过数据绑定访问类加载器相关属性,进而写入可执行页面。
# CVE-2022-22965 · Spring4Shell
## 基本信息
- 编号:CVE-2022-22965
- 组件:Spring Framework 5.3.0 至 5.3.17、5.2.0 至 5.2.19
- 触发条件:JDK 9 及以上 + Spring MVC / WebFlux + 参数绑定到非基础类型
- 严重度:critical
## 问题成因
Spring 的数据绑定会按请求参数名去访问对象属性。在 JDK 9+ 上,参数名可以被完整获取,攻击者据此构造嵌套参数名,访问到类加载器相关的访问日志属性,把请求内容写成一个 JSP 文件,之后访问该文件即执行。
## 为什么难防
- 触发依赖运行时 JDK 版本与模块组合,不是升一个包就完事
- 入口看起来完全是正常的表单参数,WAF 难以做语义判断
## 修复与缓解
1. 升级 Spring Framework 到 5.3.18 / 5.2.20 及以上
2. 同时升级依赖 Spring 的中间件到官方建议版本
3. 在 WAF 上临时拦截含有类加载器特征串的参数名
4. 部署后检查 Web 目录下是否出现非预期的新文件
## 常见坑
- 只升了 spring-core,漏了 spring-beans / spring-webmvc
- 只看版本号,没确认实际运行在 JDK 9+ 上
- 修补后没有排查是否已被写入过页面文件
## 怎么验证
在测试环境用数据绑定访问一个不存在的嵌套属性,确认返回参数绑定错误而非类加载器信息。