老版本的Spring應用該如何應對CVE-2022-22965漏洞?
阿新 • • 發佈:2022-04-02
昨天,在釋出了《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
@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。第一時間瞭解前沿行業訊息、分享深度技術乾貨、獲取優質學習資源