Spring是一款主流的Java EE輕量級(jí)開(kāi)源框架,面向服務(wù)器端開(kāi)發(fā)設(shè)計(jì)。近日,Spring框架被曝出RCE 0day漏洞,可導(dǎo)致遠(yuǎn)程代碼執(zhí)行 (RCE),使用JDK9及以上版本皆有可能受到影響,目前已經(jīng)有該漏洞的在野利用。由于該漏洞攻擊面較廣,潛在危害嚴(yán)重,提醒廣大用戶(hù)盡快排查漏洞情況,降低安全風(fēng)險(xiǎn)。
一.漏洞等級(jí)
高危。
二.受影響的版本
JDK 版本號(hào)9及以上,并且使用了Spring框架或衍生框架。
三.漏洞排查方案
(一)JDK版本號(hào)排查
在業(yè)務(wù)系統(tǒng)的運(yùn)行服務(wù)器上,執(zhí)行“java -version”命令查看運(yùn)行的JDK 版本,如果版本號(hào)小于等于8,則不受漏洞影響。
(二)Spring框架使用情況排查
1. 如果業(yè)務(wù)系統(tǒng)項(xiàng)目以war 包形式部署,按照如下步驟進(jìn)行判斷。
(1)解壓war 包:將war 文件的后綴修改成.zip ,解壓zip 文件。
(2)在解壓縮目錄下搜索是否存在spring-beans-*.jar 格式的jar 文件(例如spring-beans-5.3.16.jar),如存在則說(shuō)明業(yè)務(wù)系統(tǒng)使用了spring 框架進(jìn)行開(kāi)發(fā)。
(3)如果spring-beans-*.jar 文件不存在,則在解壓縮目錄下搜索CachedIntrospectionResuLts.class 文件是否存在,如存在則說(shuō)明業(yè)務(wù)系統(tǒng)使用了Spring 框架進(jìn)行開(kāi)發(fā)。
2.如果業(yè)務(wù)系統(tǒng)項(xiàng)目以jar 包形式直接獨(dú)立運(yùn)行,按照如下步驟進(jìn)行判斷。
(1)解壓jar 包:將jar 文件的后綴修改成.zip,解壓zip 文件。
(2)在解壓縮目錄下搜索是否存在spring-beans-*.jar 格式的jar 文件(例如spring-beans-5.3.16.jar),如存在則說(shuō)明業(yè)務(wù)系統(tǒng)使用了spring 框架進(jìn)行開(kāi)發(fā)。
(3)如果spring-beans-*.jar 文件不存在,則在解壓縮目錄下搜索CachedIntrospectionResuLts.class 文件是否存在,如存在則說(shuō)明業(yè)務(wù)系統(tǒng)使用了spring 框架進(jìn)行開(kāi)發(fā)。
3. 在完成以上兩個(gè)步驟排查后,同時(shí)滿(mǎn)足以下兩個(gè)條件可確定受此漏洞影響:
(1)JDK 版本號(hào)在9 及以上;
(2)使用了spring 框架或衍生框架。
四.解決方案:
目前,spring 官方已發(fā)布Spring Framework漏洞修復(fù)版本5.3.18和5.2.20,請(qǐng)按官方補(bǔ)丁修復(fù)漏洞。(參考鏈接:https://github.com/spring-projects/spring-framework; https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement)。
其他臨時(shí)修復(fù)方案
需同時(shí)按以下兩個(gè)步驟進(jìn)行漏洞的臨時(shí)修復(fù):
1. 在應(yīng)用中全局搜索@InitBinder 注解,看看方法體內(nèi)是否調(diào)用dataBinder.setDisallowedFields 方法,如果發(fā)現(xiàn)此代碼片段的引入,則在原來(lái)的黑名單中,添加 {class.*, Class. *, *. class.*, *.Class.*}。
注:如果此代碼片段使用較多,需要每個(gè)地方都追加。
2. 在應(yīng)用系統(tǒng)的項(xiàng)目包下新建以下全局類(lèi),并保證這個(gè)類(lèi)被Spring 加載(推薦在Controller 所在的包中添加)。完成類(lèi)添加后需對(duì)項(xiàng)目進(jìn)行重新編譯打包和功能驗(yàn)證測(cè)試,并重新發(fā)布項(xiàng)目。
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);
}
}


