導(dǎo)讀
昨晚,又一枚重磅炸彈在技術(shù)圈里引爆,不,這次不是Log4j,而是Spring:不法分子可以在遠(yuǎn)程對目標(biāo)主機肆意執(zhí)行惡意代碼,可導(dǎo)致任意文件讀取,DOS攻擊等危害,甚至導(dǎo)致業(yè)務(wù)服務(wù)器被攻陷。
考慮到Spring是全球最受歡迎的輕量級的Java開發(fā)框架,全球的安全從業(yè)者,又睡不上好覺了。
圖源:網(wǎng)上針對此事網(wǎng)友的反映
事件回顧
3月29日,Spring框架曝出RCE 0day漏洞。已經(jīng)證實由于 SerializationUtils#deserialize 基于Java的序列化機制,可導(dǎo)致遠(yuǎn)程代碼執(zhí)行(RCE),使用JDK9及以上版本皆有可能受到影響。
相關(guān)監(jiān)測發(fā)現(xiàn)該漏洞可能已被遠(yuǎn)程攻擊者利用,廣東省網(wǎng)絡(luò)安全應(yīng)急響應(yīng)中心連夜發(fā)布預(yù)警通知,考慮到Spring框架的廣泛應(yīng)用,F(xiàn)reeBuf對漏洞評級為:危險。
在Spring框架的JDK9版本(及以上版本)中,遠(yuǎn)程攻擊者可在滿足特定條件的基礎(chǔ)上,通過框架的參數(shù)綁定功能獲取AccessLogValve對象并諸如惡意字段值,從而觸發(fā)pipeline機制并寫入任意路徑下的文件。
目前已知,觸發(fā)該漏洞需要滿足兩個基本條件:
- 使用JDK9及以上版本的Spring MVC框架
- Spring 框架以及衍生的框架spring-beans-*.jar 文件或者存在CachedIntrospectionResults.class
漏洞影響范圍:
JDK9 <= Spring Cloud Function
執(zhí)行“java-version”命令可查看JDK版本
目前Spring官方并沒有發(fā)布與此漏洞相關(guān)的補丁文件,相關(guān)漏洞POC也暫未被公開??紤]到自3月29日起已在小范圍傳播,鑒于Spring MVC的廣泛應(yīng)用,各企業(yè)仍需警惕遠(yuǎn)程攻擊者,并采用廣東省網(wǎng)絡(luò)安全應(yīng)急響應(yīng)中心公布臨時方案加強防護。同時,大家還要密切關(guān)注Spring官方的補丁發(fā)布情況。
臨時方案1:WAF臨時策略
在WAF等網(wǎng)絡(luò)防護設(shè)備上,根據(jù)實際部署業(yè)務(wù)的流量情況,實現(xiàn)對“class.*”,“Class.*”,“*.class.*”,“*.Class.*”等字符串的規(guī)則過濾,并在部署過濾規(guī)則后,對業(yè)務(wù)允許情況進行測試,避免產(chǎn)生額外影響。
臨時方案2:臨時緩解措施
在應(yīng)用系統(tǒng)的項目包下新建以下全局類,并保證這個類被Spring加載到(推薦在Controller所在的包中添加).完成類添加后,需對項目進行重新編譯打包和功能驗證測試。并重新發(fā)布項目。
import org.springframework.web.bind.annotation.InitBinder;
(10000)
public class a{
public void setAllowedFields(WebDataBinder dataBinder) {
String[] abd = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};
dataBinder.setDisallowedFields(abd);
}
}
細(xì)數(shù)Spring漏洞
事實上,如果我們回顧一下Spring框架的發(fā)展歷程,會發(fā)現(xiàn)這不是Spring框架第一次被曝出漏洞。
2009年9月Spring 3.0 RC1發(fā)布后,Spring就引入了SpEL (Spring Expression Language)。
SpEL是基于spring的一個表達(dá)式語言,類似于struts的OGNL,能夠在運行時動態(tài)執(zhí)行一些運算甚至一些指令,類似于Java的反射功能。
類比Struts2框架,會發(fā)現(xiàn)絕大部分的安全漏洞都和OGNL脫不了干系。尤其是遠(yuǎn)程命令執(zhí)行漏洞,這導(dǎo)致Struts2越來越不受待見。
因此,Spring引入SpEL必然增加安全風(fēng)險。事實也是如此,過去多個Spring CVE都與其相關(guān):
1.Spring Security OAuth2 遠(yuǎn)程命令執(zhí)行(CVE-2016-4977)
漏洞簡介:Spring Security OAuth2是為Spring框架提供安全認(rèn)證支持的一個模塊。Spring Security OAuth2處理認(rèn)證請求的時候如果使用了whitelabel views,response_type參數(shù)值會被當(dāng)做Spring SpEL來執(zhí)行,攻擊者可以在被授權(quán)的情況下通過構(gòu)造response_type值也就是通過構(gòu)造惡意SpEL表達(dá)式可以觸發(fā)遠(yuǎn)程代碼執(zhí)行漏洞。故是在需要知道賬號密碼的前提下才可以利用該漏洞。
2.Spring Web Flow框架遠(yuǎn)程代碼執(zhí)行(CVE-2017-4971)
漏洞簡介:Spring Web Flow是Spring的一個子項目,主要目的是解決跨越多個請求的、用戶與服務(wù)器之間的、有狀態(tài)交互問題,提供了描述業(yè)務(wù)流程的抽象能力。
Spring WebFlow 是一個適用于開發(fā)基于流程的應(yīng)用程序的框架(如購物邏輯),可以將流程的定義和實現(xiàn)流程行為的類和視圖分離開來。在其 2.4.x 版本中,如果我們控制了數(shù)據(jù)綁定時的field,將導(dǎo)致一個SpEL表達(dá)式注入漏洞,最終造成任意命令執(zhí)行。
3.Spring Data Rest遠(yuǎn)程命令執(zhí)行命令(CVE-2017-8046)
漏洞簡介:Spring-data-rest服務(wù)器在處理PATCH請求時,攻擊者可以構(gòu)造惡意的PATCH請求并發(fā)送給spring-date-rest服務(wù)器,通過構(gòu)造好的JSON數(shù)據(jù)來執(zhí)行任意Java代碼。
4.Spring Messaging遠(yuǎn)程命令執(zhí)行突破(CVE-2018-1270)
漏洞簡介:spring messaging為spring框架提供消息支持,其上層協(xié)議是STOMP,底層通信基于SockJS,STOMP消息代理在處理客戶端消息時存在SpEL表達(dá)式注入漏洞,在spring messaging中,其允許客戶端訂閱消息,并使用selector過濾消息。selector用SpEL表達(dá)式編寫,并使用StandardEvaluationContext解析,造成命令執(zhí)行漏洞。
5.Spring Data Commons 遠(yuǎn)程命令執(zhí)行漏洞(CVE-2018-1273)
漏洞簡介:Spring Data 是一個用于簡化數(shù)據(jù)庫訪問,并支持云服務(wù)的開源框架,Spring Data Commons 是 Spring Data 下所有子項目共享的基礎(chǔ)框架。Spring Data Commons 在 2.0.5 及以前版本中,存在一處 SpEL 表達(dá)式注入漏洞,攻擊者可以注入惡意 SpEL 表達(dá)式以執(zhí)行任意命令。
除了上述漏洞,不久前Spring發(fā)布的漏洞,想必大部分人還有印象:
今年3月1日,Spring官方發(fā)布了Spring Cloud Gateway的兩個CVE漏洞,分別為CVE-2022-22946(嚴(yán)重性:Medium)與CVE-2022-22947(代碼注入漏洞,嚴(yán)重性:Critical)。
(1)HTTP2不安全的TrustManager(CVE-2022-22946):Spring Cloud Gateway 如果配置并啟用HTTP2,且未設(shè)置密鑰存儲或受信任證書,這樣Spring Cloud Gateway就能被無效或自定義的證書連接到遠(yuǎn)程服務(wù)。
(2)遠(yuǎn)程代碼執(zhí)行漏洞(CVE-2022-22947):當(dāng)Spring Cloud Gateway Actuator 端點被啟用和暴露時,使用Spring Cloud Gateway的應(yīng)用程序會存在遠(yuǎn)程代碼注入攻擊的風(fēng)險,即攻擊者可以遠(yuǎn)程發(fā)出惡意攻擊請求,允許在遠(yuǎn)程服務(wù)器上進行任意代碼執(zhí)行。
危機的啟示
這次Spring框架曝出的0day漏洞,算得上是比Log4j2漏洞還大的核彈,讓很多人猝不及防。
考慮到受影響的是升級到JDK9+的版本,這件事件也可以給我們一些啟示:無論是在開發(fā)還是生產(chǎn)環(huán)境,沒必要一定用最新版本的軟件,只需要使用最穩(wěn)定版本的軟件就夠了。