作者:xxhzz@星闌科技PortalLab
原文鏈接:https://mp.weixin.qq.com/s/3DECgzKcovoCQcdZLGXCzA
前言
在研究分析了CVE-2022-22980 Spring Data MongoDB SpEL表達式注入漏洞之后,想起之前在spring4shell爆出之前,存在于SpringCloud Function中的一個SpEL表達式注入漏洞,編號為CVE-2022-22963。在這里對其進行一波分析和學習。
漏洞描述
Spring Cloud Function 是基于 Spring Boot 的函數計算框架。該項目致力于促進函數為主的開發單元,它抽象出所有傳輸細節和基礎架構,并提供一個通用的模型,用于在各種平臺上部署基于函數的軟件。在Spring Cloud Function 相關版本,存在SpEL表達式注入。惡意攻擊者無需認證可通過構造特定的 HTTP 請求頭注入 SpEL 表達式,最終執行任意命令,獲取服務器權限。
利用范圍
3.0.0 <= Spring Cloud Function <= 3.2.2
漏洞分析
環境搭建
使用idea新建Spring Cloud Function項目。

pom.xml中引入spring-boot-starter-web、spring-cloud-function-web

在application.properties中添加spring.cloud.function.definition=functionRouter

這里設置端口為8090,默認為8080

運行之后,環境搭建完成。
前置知識
SpringCloud Function 相關介紹
簡單的介紹,Spring Cloud 是一系列框架的集合, 內部包含了許多框架,這些框架互相協作,共同來構建分布式系統。利用這些組件,可以非常方便地構建一個分布式系統。SpringCloudFunction就是一個SpringBoot開發的Servless中間件(FAAS)。

在環境搭建時,我們在application.properties中添加spring.cloud.function.definition=functionRouter
這里的屬性spring.cloud.function.definition 表示聲明式函數組合,簡單理解就是一個默認路由。具體可參考如下說明。
functionRouter
我們設置spring.cloud.function.definition=functionRouter就是使默認路由綁定具體函數交由用戶進行控制。

在spring-cloud-function-web中可以通過設置Message Headers來傳達路由指令,也可以路通過spring.cloud.function.definition 或spring.cloud.function.routing-expression作為應用程序屬性進行通信,允許使用 Spring 表達式語言 (SpEL)。
這就是產生SpEL注入的關鍵所在。
動態分析
在理解了前置知識中相關原理,其實也就能大概知曉漏洞原理。
查看DIFF(https://github.com/spring-cloud/spring-cloud-function/commit/0e89ee27b2e76138c16bcba6f4bca906c4f3744f) 記錄。

看到從請求頭中獲取的 spring.cloud.function.routing-expression 之前是由StandardEvaluationContext 解析,修復新增了 isViaHeader 變量做了一個判斷,如果是從請求頭中獲取的 spring.cloud.function.routing-expression 值,使用 SimpleEvaluationContext 解析。
在spring.cloud.function.context.catalog.simpleFunctionRegistry#doApply中。

在執行function apply方法之后,會跳轉到doApply中,對funtion進行判斷,判斷是不是functionRouter方法。
后續跟進,進入spring.cloud.function.context.config.Routingfunction#route

進入else if 分支, http頭spring.cloud.function.routing-expression 不為空,則傳入其值到functionFromExpression方法。
隨后對傳入的header進行解析處理。

后續跟進發現對Spel表達式進行解析的方法就是StandardEvaluationContext

后續跟進,在解析傳入的Spel之后,成功觸發惡意代碼。

漏洞復現

修復建議
受影響的組件更新至3.1.7、3.2.3安全版本。
參考材料
3.https://spring.io.zh.xy2401.com/projects/spring-cloud-function/#overview
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1977/
暫無評論