老版本的Spring應用該如何應對CVE-2022-22965漏洞?

程式猿DD發表於2022-04-08

昨天,在釋出了《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。第一時間瞭解前沿行業訊息、分享深度技術乾貨、獲取優質學習資源

相關文章