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