Spring 远程代码执行漏洞的介绍与修复【CVE-2022-22965】

这几天 Spring 框架爆出一个远程代码执行的漏洞,CVE-2022-22965。一些人会把这个漏洞类比于前一段时间出现的 Log4j 的漏洞。实际上,Spring 的这个问题并没有那么的严重。它所影响的范围比较窄。

如果你不关心具体的细节,只需要记得把 Spring 升级即可。Spring 5.3.18 和 Spring 5.2.20 已经修复了这个问题。对应的 Spring Boot 版本是 2.6.62.5.12

这个漏洞生效的条件是:

  • JDK 9 及以上
  • 使用 Tomcat 作为 Servlet 容器
  • 打包成传统的 WAR 包,而不是 Spring Boot 的可执行 JAR文件
  • 使用 spring-webmvcspring-webflux

该漏洞攻击的是 Spring 中的 DataBinderDataBinder 的作用是把 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);
    }

}

参考资料:

版权所有 © 2024 灵动代码