SpringShell — Spring Core 0day REC 漏洞說明(CVE-2022–22965)

Kun Yi Pan
eCloudture
Published in
5 min readApr 15, 2022

Spring Framework 集結旗下所有 Spring Projects 提供全站式的模組框架,有 Web、AOP、Data Access/Integration、Core controller…等模組,主要協助 Java developer 開發出架構完善、維護性高且測試方便的應用程式,一般常聽到的稱呼為「Spring」。

此安全漏洞於 3/31 被賦予 CVE 編號 CVE-2022–22965,並正式以 「SpringShell 」作為代稱。

在 3/29 有研究人員揭露存在於 Spring Core 模組當中的 zero-day 零時差漏洞,建議在 Spring 官方修補釋出之前,Spring Framework 的使用者可以先行限制「DataBinder」的 Class 使用,得以緩解此 PoC 攻擊程式曝光而造成的安全風險。

透過釋出的 PoC 範例 tweedge/springcore-0day-en ,可以得知該漏洞的先決條件:

  • 使用 JDK 9+ 的版本
  • 使用 Spring Beans
  • 使用 Spring Parameter Binding
  • Spring Parameter Binding 必須設定為使用 non-basic parameter type, 像是 POJOs 即可

在以 POJO 型態執行 DataBinder 動作時,該研究人員發現在 DataBinder 的過程中出現了一個 Class ,攻擊者可以以類似操作針對該 Class 做參數的改寫,進而透過 HTTP Request & HTTP Header 傳入相關攻擊行為、入侵至 Server 當中執行 Shell,實現 WebShell 來做 RCE 遠端執行程式碼攻擊。

SpringShell 的漏洞執行相當簡單,但因為其要被觸發的條件過於的「嚴苛」,需要在特定 DataBinder 的動作底下以特定的 Payload 來傳遞攻擊內容,才能觸發該漏洞。

也因為其「規則」明確,可以透過 WAF 做 HTTP/S、Layer 7 防護擋掉 Injection,或是限制 DataBinder 的功能來規避掉,因此大多數的資安廠商與社群認為 SpringShell 的嚴重性遠不如 Log4Shell 危險。

漏洞 Demo

  1. 部署 Vulnerable application,訪問其應用
Visiting vulnerable application

2. 執行範例腳本 spring-core-rce/test.py,確認漏洞是否存在

Sample — Inject the webshell

3. 若漏洞存在,腳本執行後會回傳 WebShell 位址

Return the webshell endpoint

4. 透過 WebShell 執行 RCE,取得相關資訊

Achieved the RCE

安全建議措施

  1. 升級 Spring Framework 至 5.3.18+ 或是 5.2.20+
  2. 升級 Spring Boot 及相關生態版本至 2.6.6+ 或是 2.5.12+
  3. 升級 Apache Tomcat 至 10.0.20+、9.0.62+ 或是 8.5.78+
  4. 降級至 Java 8
  5. 如不方便升級,可以在 Server/Application 前面部署相關 WAF Rules 來阻擋掉相關 Payload

Reference

--

--

Kun Yi Pan
eCloudture

Bob aka Baboo | 踩坑廢宅 | 一個孩子的爸 | STEPN Runner