关于java:老版本的Spring应用该如何应对CVE202222965漏洞

53次阅读

共计 2021 个字符,预计需要花费 6 分钟才能阅读完成。

昨天,在公布了《Spring 官宣抵赖网传大破绽,并提供解决方案》之后。群里就有几个小伙伴问了这样的问题:咱们的 Spring 版本比拟老,该怎么办?这是一个好问题,所以 DD 明天独自拿出来说说。

这次的 RCE 破绽发表之后,官网给出的次要解决方案是降级版本,但只有 Spring 5.2、5.3 和 Spring Boot 2.5、2.6 提供了对应的降级版本。

那么对于一些还在用 Spring 5.0、5.1 甚至 Spring 4.x、或者 Spring Boot 1.x 和 Spring 2.4 及以下版本的用户该怎么办呢?

第一种办法

官网给出过一种通过扩大 RequestMappingHandlerAdapter 来实现的办法。同时也给出了一个 Spring Boot 下应用 Spring MVC 的实现计划,如果是 WebFlux 的话略做批改即可。但如果不是 Spring Boot 的话,则 Bean 的初始化形式还要再改改。

@SpringBootApplication
public class MyApp {public static void main(String[] args) {SpringApplication.run(CarApp.class, args);
 }


 @Bean
 public WebMvcRegistrations mvcRegistrations() {return new WebMvcRegistrations() {
   @Override
   public RequestMappingHandlerAdapter getRequestMappingHandlerAdapter() {return new ExtendedRequestMappingHandlerAdapter();
   }
  };
 }


 private static class ExtendedRequestMappingHandlerAdapter extends RequestMappingHandlerAdapter {

  @Override
  protected InitBinderDataBinderFactory createDataBinderFactory(List<InvocableHandlerMethod> methods) {return new ServletRequestDataBinderFactory(methods, getWebBindingInitializer()) {

    @Override
    protected ServletRequestDataBinder createBinderInstance(Object target, String name, NativeWebRequest request) throws Exception {ServletRequestDataBinder binder = super.createBinderInstance(target, name, request);
     String[] fields = binder.getDisallowedFields();
     List<String> fieldList = new ArrayList<>(fields != null ? Arrays.asList(fields) : Collections.emptyList());
     fieldList.addAll(Arrays.asList("class.*", "Class.*", "*.class.*", "*.Class.*"));
     binder.setDisallowedFields(fieldList.toArray(new String[] {}));
     return binder;
    }
   };
  }
 }
}

这种须要咱们去批改代码,其实我感觉还是有点麻烦的。如果对 Spring 机制不太熟悉的话,可能还会遇到不少麻烦。上面讲讲另外的便捷办法,也是我对老我的项目举荐的办法。

第二种办法

上面要讲的办法次要是躲避的思路。什么是躲避呢?就是针对该破绽的利用条件去做一些调整。

比方,这次破绽的条件是这些:

  • JDK 9 +
  • 应用 Apache Tomcat 部署
  • 应用 WAR 形式打包
  • 依赖 spring-webmvc 或 spring-webflux

那么我就能够抉择躲避其中的 1 个条件就能避免破绽的利用了,比方:

  • 降级到 JDK 8
  • 应用 Undertow 来部署
  • 如果是 Spring Boot 的晚期项的话,还能调整打包形式,采纳 JAR 的形式打包和运行来躲避。

另外,DD 有留神到,这次破绽之后 Tomcat 的版本也更新了,所以当你用 WAR 部署的状况下,能够间接下载最新的 Tomcat 版本来躲避也是一种不错的抉择。

好了,明天的分享就到这里,解决群友 (点击加群) 的疑难是一方面,另一方面也是给大家讲讲解决问题时候的一种思考形式。有时候碰到硬茬,咱们不肯定要硬刚,换个方向解决可能性价比更高。如果您感觉明天的分享还不错,欢送点赞、在看、转发到朋友圈。

欢送关注我的公众号:程序猿 DD。第一工夫理解前沿行业音讯、分享深度技术干货、获取优质学习资源

正文完
 0