作者:VLab掃地僧@墨云科技VLab Team
原文鏈接:https://mp.weixin.qq.com/s/MiKWnGuyXTTLQVKjq2E_Gw

漏洞概述

Spring Cloud Function 是基于Spring Boot 的函數計算框架(FaaS),該項目提供了一個通用的模型,用于在各種平臺上部署基于函數的軟件,包括像 Amazon AWS Lambda 這樣的 FaaS(函數即服務,function as a service)平臺。它抽象出所有傳輸細節和基礎架構,允許開發人員保留所有熟悉的工具和流程,并專注于業務邏輯。

在版本3.0.0到當前最新版本3.2.2(commit dc5128b),默認配置下,都存在Spring Cloud Function SpEL表達式注入漏洞。

漏洞復現

在IDEA中選擇新建項目,然后選擇Spring Initializr,輸入隨機項目名稱,然后選擇java版本和jdk版本后點擊下一步。

圖片

選擇Spring WebFunction作為依賴項,點擊完成。

圖片

漏洞環境就搭建完成。因當前官方還未發布新版本,所以最新版本3.2.2也是存在漏洞的,若在官方出新版本后想要復現此漏洞,那么需要修改pom中spring-cloud-function-web的版本為3.2.2,如下圖所示:

圖片

確認項目中的spring-cloud-function-web是存在漏洞版本后,就可以直接啟動項目了,無需進行任何修改。

圖片

然后對本地8080端口發送payload即可。

圖片

漏洞分析

先看git提交記錄,https://github.com/spring-cloud/spring-cloud-function/commit/0e89ee27b2e76138c16bcba6f4bca906c4f3744f ,在提交描述中,明確指出修復了RoutingFunction SpEL代碼注入漏洞,并且可以看到目前只更新了兩個文件,其中一個文件僅為單元測試。

圖片

在測試用例中也清楚寫明了漏洞位置以及相關測試Payload。

圖片

通過測試用例可知,在給Spring Cloud Function的web服務發送包的時候,加一個相關的Header信息,然后附上SpEL表達式即可執行命令。

圖片

在文件org.springframework.cloud.function.context.config.RoutingFunction中,請求進入到apply方法,接著調用了route方法,然后通過判斷特定的消息頭信息是否為空,如果不為空則調用functionFromExpression方法。

圖片

圖片

因調用到了SpEL對routingExpression進行解析,從而導致了SpEL表達式注入。

圖片

整個邏輯中由于完全信任從最開始傳入的header信息,并且在解析SpEL表達式時候的evalContext使用的是功能更強同時安全隱患較大的StandardEcalutionContext

圖片

在官方最新的修補文件中,可以看到新增了headerEvalContext對象,該對象所對應的是使用了僅支持最基本功能的SimpleEvaluationContext

圖片

且在調用functionFromExpression方法的時候新增了一個isViaHead布爾類型的參數,用來判斷該值是否是取自消息的header中,如果是則使用headerEvalContext對象來解析SpEL表達式。

圖片

修復建議

建議您在升級前做好數據備份工作,避免出現意外。目前SpringCloud Function官方已針對此漏洞進行修復,但還沒有發布正式版本,可拉取最新修復代碼重新編譯打包進行臨時修補。

官方已發布修復補丁參考地址:https://github.com/spring-cloud/spring-cloud-function/commit/0e89ee27b2e76138c16bcba6f4bca906c4f3744f


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