Log4j 未平,Spring高危漏洞又起!
Spring是Java EE編程領(lǐng)域的一個(gè)熱門(mén)開(kāi)源框架,該框架在2002年創(chuàng)建,是為了解決企業(yè)級(jí)編程開(kāi)發(fā)中的復(fù)雜性,業(yè)務(wù)邏輯層和其他各層的松耦合問(wèn)題,因此它將面向接口的編程思想貫穿整個(gè)系統(tǒng)應(yīng)用,實(shí)現(xiàn)敏捷開(kāi)發(fā)的應(yīng)用型框架。目前,Spring 框架已被包括科技巨頭公司在內(nèi)的大量企業(yè)廣泛采用,還包括一些“無(wú)服務(wù)器”(serverless)服務(wù)提供商。
據(jù)外媒消息,Spring官方日前在github上更新了一條可能導(dǎo)致命令執(zhí)行漏洞的修復(fù)代碼,該漏洞目前在互聯(lián)網(wǎng)中已被成功驗(yàn)證。研究機(jī)構(gòu)將該漏洞評(píng)價(jià)為高危級(jí)。對(duì)于應(yīng)用JDK版本號(hào)為9及以上的企業(yè),建議盡快開(kāi)展Spring框架使用情況的排查與漏洞處置工作。
漏洞排查
(1) 如果業(yè)務(wù)系統(tǒng)項(xiàng)目以war包形式部署,按照如下步驟進(jìn)行判斷:
- 解壓war包:將war文件的后綴修改成.zip ,解壓zip文件。
- 在解壓縮目錄下搜索是否存在 spring-beans-*.jar 格式的jar文件(例如spring-beans-5.3.16.jar),如存在則說(shuō)明業(yè)務(wù)系統(tǒng)使用了spring框架進(jìn)行開(kāi)發(fā)。
- 如果spring-beans-*.jar 文件不存在,則在解壓縮目錄下搜索CachedIntrospectionResuLts.class 文件是否存在,如存在則說(shuō)明業(yè)務(wù)系統(tǒng)使用了Spring框架開(kāi)發(fā)。
(2) 如果業(yè)務(wù)系統(tǒng)項(xiàng)目以jar包形式直接獨(dú)立運(yùn)行,按照如下步驟進(jìn)行判斷:
- 解壓jar包:將jar文件的后綴修改成.zip,解壓zip文件。
- 在解壓縮目錄下搜索是否存在spring-beans-*.jar 格式的jar文件(例如spring-beans-5.3.16.jar),如存在則說(shuō)明業(yè)務(wù)系統(tǒng)使用了spring框架進(jìn)行開(kāi)發(fā)。
- 如果spring-beans-*.jar 文件不存在,則在解壓縮目錄下搜索CachedIntrospectionResuLts.class 文件是否存在,如存在則說(shuō)明業(yè)務(wù)系統(tǒng)使用了spring框架進(jìn)行開(kāi)發(fā)。
漏洞修復(fù)
目前,spring官方尚未正式發(fā)布漏洞補(bǔ)丁,安全專(zhuān)家建議采用以下二個(gè)臨時(shí)方案進(jìn)行防護(hù),并及時(shí)關(guān)注官方補(bǔ)丁發(fā)布情況。
(1) WAF防護(hù)
在WAF等網(wǎng)絡(luò)防護(hù)設(shè)備上,根據(jù)實(shí)際部署業(yè)務(wù)的流量情況,實(shí)現(xiàn)對(duì)“class.*”“Class.*”“*.class.*”“*.Class.*”等字符串的規(guī)則過(guò)濾,并在部暑過(guò)濾規(guī)則后,對(duì)業(yè)務(wù)運(yùn)行情況進(jìn)行測(cè)試,避免產(chǎn)生額外影響。
(2) 臨時(shí)修復(fù)措施
需同時(shí)按以下兩個(gè)步驟進(jìn)行漏澗的臨時(shí)修復(fù):
- 在應(yīng)用中全局搜索@InitBinder注解,看看方法體內(nèi)是否調(diào)用dataBinder.setDisallowedFields方法,如果發(fā)現(xiàn)此代碼片段的引入,則在原來(lái)的黑名單中,添加{"class.*","Class. *","*. class.*", "*.Class.*"}。
- 在應(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);
}
}