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