Spring官宣網傳大漏洞,並提供解決方案


Spring淪陷了!這樣的標題這幾天是不是看膩了?然而,仔細看看都是拿着之前的幾個毫不相干的CVE來大吹特吹。所以,昨天發了一篇關於最近網傳的Spring大漏洞的文章,聊了聊這些讓人迷惑的營銷文、以及提醒大家不要去下載一些利用漏洞提供補丁的釣魚內容。而對於這個網傳的漏洞,依然保持關注狀態,因為確實可能存在,只是沒有官宣。

就在不久前(3月31日晚),Spring社區發布了一篇名為《Spring Framework RCE, Early Announcement》的文章,官宣了最近網傳的Spring漏洞。這也證實了網傳漏洞確實存在,並且並非最近很多文章說提到的3月28、29日公布的CVE,如果你是照着那些文章解決問題的話,請根據這次官宣內容重新來過吧。

這次確定的Spring核心框架中的RCE漏洞,CVE號為CVE-2022-22965[1]。

CVE-2022-22965

這個漏洞是在周二深夜,由AntGroup FG的codePlutos,meizjm3i向VMware報告。周三,Spring官方對該問題進行了調查、分析並確定了解決方案,同時計划在周四進行緊急版本的發布

由於該漏洞被泄漏在網絡上,所以Spring官方緊急發布了相關修復的版本,因為是Spring核心框架中的漏洞,所以涉及面較廣。所以在這篇博文中也是在不斷的持續更新進展,下面截止到本文發稿的進展時間線:

Spring Framework RCE, Early Announcement - Update

下面就來一起看看這個被網傳了2天的神秘漏洞的官宣內容和解決方案。

影響范圍

該漏洞的利用需要滿足下面的條件:

  • JDK 9 +
  • 使用Apache Tomcat部署
  • 使用WAR方式打包
  • 依賴spring-webmvc或spring-webflux

雖然可能國內大部分用戶還在用JDK 8、或者采用內置Tomcat的方式運行,但由於該漏洞的特性比較普遍,不排除其他利用方式的存在。所以,DD還是建議在有條件的情況下,盡快升到最新版本來避免可能存在的風險發生。

解決方案

因為這次不是網傳,而是Spring官宣,所以解決方案已經相對完善和容易了,受影響的用戶可以通過下面的方法解決該漏洞的風險:

  • Spring 5.3.x用戶升級到5.3.18+
  • Spring 5.2.x用戶升級到5.2.20+
  • Spring Boot 2.6.x用戶升級到2.6.6+
  • Spring Boot 2.5.x用戶升級到2.5.12+

對於該漏洞的復習及更多細節,這里因為篇幅有限,就不具體介紹了,感興趣的小伙伴可以關注公眾號程序猿DD,回復“CVE-2022-22965”,獲取更深入的解析文檔。

然后,這里需要特別再提一下,之前已經收到消息並有所行動的小伙伴,沒猜錯的話應該都是用下面的解決方案來處理的吧?

@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);
    }

}

這個方法DD在微信群里(點擊加群)也看到蠻多次了。這次Spring官方推文里,證實了該方法是有效的,但可能會留下一些其他隱患,特別是當Controller通過其自己的@InitBinder方法在本地設置disalloedFields時,該方法會覆蓋全局設置。

為了以更安全的方式應用解決方案,應用程序可以擴展RequestMappingHandlerAdapter,以便在所有其他初始化結束后更新WebDataBinder。官方給出了更好的解決方案,比如下面這樣:

@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 Boot應用下的Spring MVC用戶,可以直接從@EnableWebMvc切換到擴展DelegatingWebMvcConfiguration,如文檔的高級配置部分所述[3],然后重寫createRequestMappingHandlerAdapter方法來實現。

好了,今天的分享就到這里!如果您學習過程中如遇困難?可以加入我們超高質量的Spring技術交流群,參與交流與討論,更好的學習與進步!更多Spring Boot教程可以點擊直達!,歡迎收藏與轉發支持!

參考資料

歡迎關注我的公眾號:程序猿DD。第一時間了解前沿行業消息、分享深度技術干貨、獲取優質學習資源


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM