作者: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安全版本。

參考材料

1.https://docs.spring.io/spring-cloud-function/docs/3.2.2/reference/html/spring-cloud-function.html#_declarative_function_composition

2.https://github.com/spring-cloud/spring-cloud-function/commit/0e89ee27b2e76138c16bcba6f4bca906c4f3744f

3.https://spring.io.zh.xy2401.com/projects/spring-cloud-function/#overview


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1977/