Spring 远程代码执行漏洞的介绍与修复【CVE-2022-22965】
这几天 Spring 框架爆出一个远程代码执行的漏洞,CVE-2022-22965。一些人会把这个漏洞类比于前一段时间出现的 Log4j 的漏洞。实际上,Spring 的这个问题并没有那么的严重。它所影响的范围比较窄。
如果你不关心具体的细节,只需要记得把 Spring 升级即可。Spring 5.3.18
和 Spring 5.2.20
已经修复了这个问题。对应的 Spring Boot 版本是 2.6.6
和 2.5.12
。
这个漏洞生效的条件是:
- JDK 9 及以上
- 使用 Tomcat 作为 Servlet 容器
- 打包成传统的 WAR 包,而不是 Spring Boot 的可执行 JAR文件
- 使用
spring-webmvc
或spring-webflux
该漏洞攻击的是 Spring 中的 DataBinder
。DataBinder
的作用是把 POST
请求中的内容绑定到对象上。在漏洞修复之前,DataBinder
没有对字段进行检查。敏感字段,比如与 class 相关的字段,都是可以被绑定的。攻击者可以通过构造特殊的请求内容,来设置敏感字段的值,从而达到执行代码的目标。
如果无法升级 Spring,可以配置 DataBinder
来禁止访问这些敏感字段。
在下面的代码中,在 Spring 的 ControllerAdvice
中,使用 @InitBinder
注解获取到 WebDataBinder
对象的引用,再使用 setDisallowedFields
方法设置禁止访问的字段,就可以避免产生这个漏洞。
@ControllerAdvice
@Order(Ordered.LOWEST_PRECEDENCE)
public class BinderControllerAdvice {
@InitBinder
public void setAllowedFields(WebDataBinder dataBinder) {
String[] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};
dataBinder.setDisallowedFields(denylist);
}
}
参考资料: