天天看點

一文詳解SpEL表達式注入漏洞

作者:華為雲開發者聯盟

本文分享自華為雲社群《SpEL表達式注入漏洞分析、檢查與防禦-雲社群-華為雲》,作者:華為雲軟體分析Lab。

在安全角度來看外部來源的資料,均應視為不可信資料,對外部資料,其包含的所有資訊都須經過校驗或者過濾,再向下遊服務進行傳遞。若無防護手段,攻擊者可以通過構造惡意輸入,對服務進行攻擊。程式中如果使用未經校驗的輸入構造SpEL語句,就有可能造成SpEL表達式注入漏洞。部分SpEL表達式注入漏洞CVSS3.x 評分極高,nvd認定為高危漏洞,具有高緻命性。

1 SpEL表達式介紹

Spring表達式語言(Spring Expression Language,SpEL)是 Spring Framework的核心技術之一,其支援在運作時查詢和操作對象圖。SpEL文法類似于Unified Expression Language,但提供了更加豐富的功能,最特别的是方法調用與字元串模闆功能。SpEL主要支援以下功能:

• 文字表達式

• 布爾和關系運算符

• 正規表達式

• 類表達式

• 通路 properties, arrays, lists, maps

• 方法調用

• 關系運算符

• 參數

• 調用構造函數

• Bean引用

• 構造Array

• 内嵌lists

• 内嵌maps

• 三元運算符

• 變量

• 使用者定義的函數

• 集合投影

• 集合篩選

• 模闆表達式

SpEL功能強大,可以操作類和方法。

• 引用方法:dog.run()

• 引用靜态方法:T(java.lang.Math).PI

• 類執行個體化:使用new執行個體化對象,類名必須是全限定名,java.lang包内的除外如Integer、String等

• 變量定義及指派引用

在解析SpEL之後,擷取表達式結果時,可以指定表達式的上下文對象:EvaluationContext

• (預設)StandardEvaluationContext:支援全套SpEL語言和功能配置選項,功能強大但存在隐患

• SimpleEvaluationContext:僅支援SpEL文法的子集,不包括Java類型引用,構造函數和bean引用,功能相對簡單但是安全

2 SpEL表達式注入漏洞

曆史報告的大部分SpEL漏洞大多涉及不受信任的使用者輸入的情況,惡意攻擊者可能利用SpEL實作任意代碼執行、拒絕服務等攻擊,與SpEL相關的部分CVE漏洞見表 1。

一文詳解SpEL表達式注入漏洞

表 1 部分SpEL注入CVE漏洞

常見的SpEL注入攻擊流程如圖 1所示,漏洞的基本條件有: 使用StandardEvaluationContext,2. 未對輸入的SpEL進行校驗,3. 對表達式調用了getValue()或setValue()方法。當滿足上述條件時,就給了攻擊者可乘之機。

一文詳解SpEL表達式注入漏洞

圖 1 常見的SpEL注入攻擊流程

3 漏洞執行個體

3.1 CVE-2022-22963 Spring Cloud Function SpEL注入漏洞

3.1.1 基本資訊

一文詳解SpEL表達式注入漏洞

3.1.2 Spring Cloud Function 介紹

Spring Cloud Function 是基于 Spring Boot 的函數計算架構。它提供了一個通用的模型,用于在各種平台上部署基于函數的軟體,包括像 Amazon AWS Lambda 這樣的 FaaS(函數即服務,function as a service)平台。該項目緻力于促進函數為主的開發單元,它抽象出所有傳輸細節和基礎架構,并提供一個通用的模型,用于在各種平台上部署基于函數的軟體。

3.1.3 CVE-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所示。

一文詳解SpEL表達式注入漏洞

圖 2 CVE-2022-22963漏洞攻擊路徑

3.1.4 CVE-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所示。

一文詳解SpEL表達式注入漏洞

圖 3 CVE-2022-22963漏洞修複

3.2 CVE-2022-22980 Spring Data MongoDB SpEL 表達式注入漏洞

3.2.1 基本資訊

一文詳解SpEL表達式注入漏洞

3.2.2 Spring Data for MongoDB 介紹

Spring Data for MongoDB是Spring Data的一個子子產品。 目标是為MongoDB提供一個相近的一緻的基于Spring的程式設計模型。其核心功能是映射POJO到Mongo的DBCollection中的文檔,并且提供Repository 風格資料通路層。主要特性有:

• Spring 配置支援:使用基于 Java 的 @Configuration 類或基于 XML 命名空間的配置來驅動 Mongo 執行個體和副本

• MongoTemplate 輔助類:可提高執行常見 Mongo 操作的效率,包括文檔和 POJO 之間的內建對象映射

• 異常處理:異常轉換為 Spring 的可移植的資料通路異常層次結構

• 功能豐富的對象映射與 Spring 的轉換服務內建

• 基于注釋的映射中繼資料、并且可擴充以支援其他中繼資料格式

• 持久化和映射生命周期事件

• 使用 MongoReader/MongoWriter 抽象的低級映射

• 基于 Java 的查詢、條件和更新 DSL

• Repository 接口的自動實作,包括對自定義查詢方法的支援

• QueryDSL 內建以支援類型安全的查詢,以及地理空間整合

• Map-Reduce 內建

• JMX 管理和監控

• 對存儲庫的 CDI 支援

• GridFS 支援

3.2.3 CVE-2022-22980漏洞攻擊路徑

一文詳解SpEL表達式注入漏洞

圖 4 CVE-2022-22980漏洞攻擊路徑

一文詳解SpEL表達式注入漏洞

圖 4 CVE-2022-22980漏洞攻擊路徑

3.2.4 CVE-2022-22980複現

1) 實驗代碼:learnjavabug

2) 運作服務,com.threedr3am.bug.spring.data.mongodb.Application#main

3) Postman發送請求,如圖 5所示

一文詳解SpEL表達式注入漏洞

圖 5 Postman填寫參數示例

4) 現象:電腦程式被執行

3.2.5 CVE-2022-22980修複方式

Spring Data for MongoDB在修複此漏洞時,重新實作evaluator,指定EvaluationContext類型,如圖 6所示。

一文詳解SpEL表達式注入漏洞

圖 6 CVE-2022-22980修複方式

4 檢測與防禦手段

(1)對于SpEL表達式注入漏洞漏洞,可以使用靜态分析工具進行代碼檢查,可以有效規避部分問題。

(2)在此類場景中,對于使用者輸入,應當仔細校驗,檢查使用者輸入的合法性,保障其内容為正常資料。且在端側與服務側均應對使用者資料進行校驗,對非受信使用者輸入資料進行淨化,避免使用者輸入任意内容。

(3)及時更新Spring Framework版本,避免因版本老舊而被利用的問題發生。

(4)使用源碼靜态分析工具進行白盒自動化檢測,在代碼合入階段、靜态分析監控階段及時發現相關問題。

文章來自 PaaS技術創新Lab,PaaS技術創新Lab隸屬于華為雲,緻力于綜合利用軟體分析、資料挖掘、機器學習等技術,為軟體研發人員提供下一代智能研發工具服務的核心引擎和智慧大腦。我們将聚焦軟體工程領域硬核能力,不斷構築研發利器,持續傳遞高價值商業特性!加入我們,一起開創研發新“境界”!

PaaS技術創新Lab首頁連結:https://www.huaweicloud.com/lab/paas/home.html

點選下方 ,第一時間了解華為雲新鮮技術~

華為雲部落格_大資料部落格_AI部落格_雲計算部落格_開發者中心-華為雲

#華為雲開發者聯盟#

繼續閱讀