在安全角度來看外部來源的數(shù)據(jù),均應(yīng)視為不可信數(shù)據(jù),對(duì)外部數(shù)據(jù),其包含的所有信息都須經(jīng)過校驗(yàn)或者過濾,再向下游服務(wù)進(jìn)行傳遞。若無防護(hù)手段,攻擊者可以通過構(gòu)造惡意輸入,對(duì)服務(wù)進(jìn)行攻擊。程序中如果使用未經(jīng)校驗(yàn)的輸入構(gòu)造SpEL語句,就有可能造成SpEL表達(dá)式注入漏洞。部分SpEL表達(dá)式注入漏洞CVSS3.x 評(píng)分極高,nvd認(rèn)定為高危漏洞,具有高致命性。
一、SpEL表達(dá)式介紹
Spring表達(dá)式語言(Spring Expression Language,SpEL)是 Spring Framework的核心技術(shù)之一,其支持在運(yùn)行時(shí)查詢和操作對(duì)象圖。SpEL語法類似于Unified Expression Language,但提供了更加豐富的功能,最特別的是方法調(diào)用與字符串模板功能。SpEL主要支持以下功能:
文字表達(dá)式
布爾和關(guān)系運(yùn)算符
正則表達(dá)式
類表達(dá)式
訪問properties, arrays, lists, maps
方法調(diào)用
關(guān)系運(yùn)算符
調(diào)用構(gòu)造函數(shù)
Bean引用
構(gòu)造Array
內(nèi)嵌lists
內(nèi)嵌maps
三元運(yùn)算符
變量
用戶定義的函數(shù)
集合投影
集合篩選
模板表達(dá)式
SpEL功能強(qiáng)大,可以操作類和方法:
在解析SpEL之后,獲取表達(dá)式結(jié)果時(shí),可以指定表達(dá)式的上下文對(duì)象:EvaluationContext
StandardEvaluationContext(默認(rèn)):支持全套SpEL語言和功能配置選項(xiàng),功能強(qiáng)大但存在隱患
SimpleEvaluationContext:僅支持SpEL語法的子集,不包括Java類型引用,構(gòu)造函數(shù)和bean引用,功能相對(duì)簡(jiǎn)單但是安全
二、SpEL表達(dá)式注入漏洞
歷史報(bào)告的大部分SpEL漏洞大多涉及不受信任的用戶輸入的情況,惡意攻擊者可能利用SpEL實(shí)現(xiàn)任意代碼執(zhí)行、拒絕服務(wù)等攻擊,與SpEL相關(guān)的部分CVE漏洞見表1。
表1部分SpEL注入CVE漏洞
常見的SpEL注入攻擊流程如圖 1所示,漏洞的基本條件有:1.使用StandardEvaluationContext;2. 未對(duì)輸入的SpEL進(jìn)行校驗(yàn);3. 對(duì)表達(dá)式調(diào)用了getValue()或setValue()方法。當(dāng)滿足上述條件時(shí),就給了攻擊者可乘之機(jī)。
圖1常見的SpEL注入攻擊流程
三、漏洞實(shí)例
| 3.1CVE-2022-22963 Spring Cloud FunctionSpEL注入漏洞
|3.1.1基本信息
漏洞id:
CVE-2022-22963
漏洞簡(jiǎn)介:
在Spring Cloud Function 相關(guān)版本,存在SpEL表達(dá)式注入。惡意攻擊者無需認(rèn)證可通過構(gòu)造特定的 HTTP 請(qǐng)求頭注入 SpEL 表達(dá)式,最終執(zhí)行任意命令,獲取服務(wù)器權(quán)限。
漏洞發(fā)布地址:
https://nvd.nist.gov/vuln/detail/cve-2022-22963
漏洞安全級(jí)別:
高
漏洞代碼倉地址:
https://github.com/spring-cloud/spring-cloud-function
漏洞補(bǔ)丁提交地址:
https://github.com/spring-cloud/spring-cloud-function/commit/0e89ee27b2e76138c16bcba6f4bca906c4f3744f
漏洞影響包版本:
3.0.0 <= Spring Cloud Function <= 3.2.2
|3.1.2Spring Cloud Function介紹
Spring Cloud Function 是基于 Spring Boot 的函數(shù)計(jì)算框架。它提供了一個(gè)通用的模型,用于在各種平臺(tái)上部署基于函數(shù)的軟件,包括像 Amazon AWS Lambda 這樣的 FaaS(函數(shù)即服務(wù),function as a service)平臺(tái)。該項(xiàng)目致力于促進(jìn)函數(shù)為主的開發(fā)單元,它抽象出所有傳輸細(xì)節(jié)和基礎(chǔ)架構(gòu),并提供一個(gè)通用的模型,用于在各種平臺(tái)上部署基于函數(shù)的軟件。
|3.1.3CVE-2022-22963漏洞攻擊路徑
使用spring-cloud-function-web的Spring boot 應(yīng)用,通過設(shè)置Message Headers來傳達(dá)路由指令,也可以在請(qǐng)求頭中指定spring.cloud.function.definition 或spring.cloud.function.routing-expression作為應(yīng)用程序?qū)傩裕试S使用 Spring 表達(dá)式語言。
當(dāng)在application.properties中設(shè)置spring.cloud.function.definition=functionRouter從而將默認(rèn)路由綁定具體函數(shù)由用戶進(jìn)行控制。
攻擊者調(diào)用/functionRouter接口,并在請(qǐng)求頭的spring.cloud.function.routing-expression中使用攻擊性的SpEL語句,服務(wù)端就會(huì)解析SpEL并執(zhí)行。
漏洞攻擊圖示如圖 2所示。
圖2CVE-2022-22963漏洞攻擊路徑
|3.1.4CVE-2022-22963漏洞修復(fù)方式
該漏洞主要從四處進(jìn)行了修復(fù):
(1)聲明一個(gè)SimpleEvaluationContext,專用作來自header的SpEL的解析;
(2)新增一個(gè)布爾變量isViaHeader,用于標(biāo)記當(dāng)前Expression是否來自Header;
(3)如果是從Header中獲取的spring.cloud.function.routing-expression表達(dá)式,isViaHeader為true ;
(4)isViaHeader為true時(shí),expression.getValue指定使用headerEvalContext。
如圖 3所示。
圖3CVE-2022-22963漏洞修復(fù)
| 3.2CVE-2022-22980 Spring DataMongoDBSpEL表達(dá)式注入漏洞
|3.2.1基本信息
漏洞id:
CVE-2022-22980
漏洞簡(jiǎn)介:
Spring Data for MongoDB是 Spring Data 項(xiàng)目的一部分,該項(xiàng)目旨在為新的數(shù)據(jù)存儲(chǔ)提供熟悉和一致的基于Spring的編程模型,同時(shí)保留存儲(chǔ)的特定特征和功能。Spring Data MongoDB應(yīng)用程序在對(duì)包含查詢參數(shù)占位符的SpEL表達(dá)式使用@Query或@Aggregation注解的查詢方法進(jìn)行值綁定時(shí),如果輸入未被過濾,則容易受到SpEL注入攻擊。
漏洞發(fā)布地址:
https://nvd.nist.gov/vuln/detail/CVE-2022-22980
漏洞安全級(jí)別:
高(CVSS3.x: 9.8)
漏洞代碼倉地址:
https://github.com/spring-projects/spring-data-mongodb
漏洞補(bǔ)丁提交地址:
3.3.xhttps://github.com/spring-projects/spring-data-mongodb/commit/7c5ac764b343d45e5d0abbaba4e82395b471b4c43.4.xhttps://github.com/spring-projects/spring-data-mongodb/commit/5e241c6ea55939c9587fad5058a07d7b3f0ccbd3
漏洞影響包版本:
Spring DataMongoDB== 3.4.0 3.3.0 <= Spring Data?MongoDB?<= 3.3.4?其他不維護(hù)的老版本
漏洞時(shí)間線:
|3.2.2Spring Data forMongoDB介紹
Spring Data for MongoDB是Spring Data的一個(gè)子模塊。目標(biāo)是為MongoDB提供一個(gè)相近的一致的基于Spring的編程模型。其核心功能是映射POJO到Mongo的DBCollection中的文檔,并且提供Repository 風(fēng)格數(shù)據(jù)訪問層。主要特性有:
Spring 配置支持:
使用基于Java的@Configuration類或基于XML命名空間的配置來驅(qū)動(dòng)Mongo實(shí)例和副本
MongoTemplate輔助類:
可提高執(zhí)行常見Mongo操作的效率,包括文檔和POJO之間的集成對(duì)象映射
異常處理:
異常轉(zhuǎn)換為Spring的可移植的數(shù)據(jù)訪問異常層次結(jié)構(gòu)
功能豐富的對(duì)象映射與Spring的轉(zhuǎn)換服務(wù)集成
基于注釋的映射元數(shù)據(jù)、并且可擴(kuò)展以支持其他元數(shù)據(jù)格式
持久化和映射生命周期事件
使用MongoReader/MongoWrite 抽象的低級(jí)映射
基于Java的查詢、條件和更新DSL
Repository接口的自動(dòng)實(shí)現(xiàn),包括對(duì)自定義查詢方法的支持
QueryDSL集成以支持類型安全的查詢,以及地理空間整合
Map-Reduce集成
JMX管理和監(jiān)控
對(duì)存儲(chǔ)庫的CDI支持
GridFS支持
|3.2.3CVE-2022-22980漏洞攻擊路徑
圖4CVE-2022-22980漏洞攻擊路徑
|3.2.4CVE-2022-22980復(fù)現(xiàn)
1)實(shí)驗(yàn)代碼:learnjavabug
2)運(yùn)行服務(wù),com.threedr3am.bug.spring.data.mongodb.Application#main
3)Postman發(fā)送請(qǐng)求,如圖5所示
圖5Postman填寫參數(shù)示例
4)現(xiàn)象:計(jì)算器程序被執(zhí)行
|3.2.5CVE-2022-22980修復(fù)方式
Spring Data for MongoDB在修復(fù)此漏洞時(shí),重新實(shí)現(xiàn)evaluator,指定EvaluationContext類型,如圖 6所示。
圖6CVE-2022-22980修復(fù)方式
四、檢測(cè)與防御手段
(1)對(duì)于SpEL表達(dá)式注入漏洞漏洞,可以使用靜態(tài)分析工具進(jìn)行代碼檢查,可以有效規(guī)避部分問題。
(2)在此類場(chǎng)景中,對(duì)于用戶輸入,應(yīng)當(dāng)仔細(xì)校驗(yàn),檢查用戶輸入的合法性,保障其內(nèi)容為正常數(shù)據(jù)。且在端側(cè)與服務(wù)側(cè)均應(yīng)對(duì)用戶數(shù)據(jù)進(jìn)行校驗(yàn),對(duì)非受信用戶輸入數(shù)據(jù)進(jìn)行凈化,避免用戶輸入任意內(nèi)容。
(3)及時(shí)更新Spring Framework版本,避免因版本老舊而被利用的問題發(fā)生。
(4)使用源碼靜態(tài)分析工具進(jìn)行白盒自動(dòng)化檢測(cè),在代碼合入階段、靜態(tài)分析監(jiān)控階段及時(shí)發(fā)現(xiàn)相關(guān)問題。
原文標(biāo)題:技術(shù)解讀 | SpEL表達(dá)式注入漏洞分析、檢查與防御
文章出處:【微信公眾號(hào):華為DevCloud】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
華為
+關(guān)注
關(guān)注
216文章
34411瀏覽量
251503
原文標(biāo)題:技術(shù)解讀 | SpEL表達(dá)式注入漏洞分析、檢查與防御
文章出處:【微信號(hào):華為DevCloud,微信公眾號(hào):華為DevCloud】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論