1. 程式人生 > 其它 >開源應用框架Spring Framework存在遠端程式碼執行漏洞(CVE-2022-22965)解決方案

開源應用框架Spring Framework存在遠端程式碼執行漏洞(CVE-2022-22965)解決方案

監測發現,開源應用框架Spring Framework存在遠端程式碼執行漏洞(CVE-2022-22965)。經分析研判,在JDK(Java開發工具包)9及以上版本環境中,或版本低於5.3.18和5.2.20的Spring框架及衍生框架構建的網站或應用中,攻擊者可利用該漏洞執行遠端命令,進而控制目標主機。目前,Spring官方已釋出Spring Framework漏洞修復版本5.3.18和5.2.20(參考連結:https://github.com/spring-projects/spring-framework; https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement

)。

 

 

具體漏洞及修復資訊如下

一·漏洞影響排查方法 (一).JDK 版本號排查 在業務系統的執行伺服器上,執行“java -version”命令檢視執行的 JDK 版本,如果版本號小 於等於 8,則不受漏洞影響 (二).Spring 框架使用情況排查 1.如果業務系統專案以 war 包形式部署,按照如下步驟進行判斷。 ⑴解壓 war 包:將 war 檔案的字尾修改成.zip ,解壓 zip 檔案 ⑵ 在 解 壓 縮 目 錄 下 搜 索 是 否 存 在 spring-beans-*.jar 格 式 的 jar 文 件 ( 例 如 spring-beans-5.3.16.jar),如存在則說明業務系統使用了 spring 框架進行開發。 ⑶ 如 果 spring-beans-*.jar 文 件 不 存 在 , 則 在 解 壓 縮 目 錄 下 搜 索 CachedIntrospectionResuLts.class 檔案是否存在,如存在則說明業務系統使用了 Spring 框架 開發。 2.如果業務系統專案以 jar 包形式直接獨立執行,按照如下步驟進行判斷。 ⑴解壓 jar 包:將 jar 檔案的字尾修改成.zip,解壓 zip 檔案。 ⑵ 在 解 壓 縮 目 錄 下 搜 索 是 否 存 在 spring-beans-*.jar 格 式 的 jar 文 件 ( 例 如 spring-beans-5.3.16.jar),如存在則說明業務系統使用了 spring 框架進行開發。 ⑶ 如 果 spring-beans-*.jar 文 件 不 存 在 , 則 在 解 壓 縮 目 錄 下 搜 索 CachedIntrospectionResuLts.class 檔案是否存在,如存在則說明業務系統使用了 spring 框架 進行開發。 (三).綜合判斷 在完成以上兩個步驟排查後,同時滿足以下兩個條件可確定受此漏洞影響: ⑴JDK 版本號在 9 及以上的; ⑵使用了 spring 框架或衍生框架。 二·漏洞修復建議 目前,spring 官方無官方補丁,建議採用以下二個臨時方案進行防護,並及時關注官方補丁 釋出情況,按官方補丁修復漏洞。 (一)WAF 防護 在 WAF 等網路防護裝置上,根據實際部署業務的流量情況,實現對“class.*”“Class.*” “*.class.*”“*.Class.*”等字串的規則過濾,並在部暑過濾規則後,對業務執行情況進行 測試,避免產生額外影響。 (二)臨時修復措施 需同時按以下兩個步驟進行漏澗的臨時修復: 1.在應用中全域性搜尋@InitBinder 註解,看看方法體內是否呼叫 dataBinder.setDisallowedFields 方法,如果發現此程式碼片段的引入,則在原來的黑名單中,新增{"class.*","Class. *","*. class.*", "*.Class.*"}。 (注:如果此程式碼片段使用較多,需要每個地方都追加) 2. 在應用系統的專案包下新建以下全域性類,並保證這個類被 Spring 載入到(推薦在 Controller 所在的包中新增).完成類新增後,需對專案進行重新編譯打包和功能驗證測試。並重新發布 專案。


import org.springframework.core.annotation.Order;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
@ControllerAdvice
@Order(10000)
public class GlobalControllerAdvice{
@InitBinder
public void setAllowedFields(webdataBinder dataBinder){
String[]abd=new string[]{"class.*","Class.*","*.class.*","*.Class.*"};
dataBinder.setDisallowedFields(abd);
}

 

https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement