SpringShell — Spring Core 0day REC 漏洞說明(CVE-2022–22965)
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
- 部署 Vulnerable application,訪問其應用
2. 執行範例腳本 spring-core-rce/test.py,確認漏洞是否存在
3. 若漏洞存在,腳本執行後會回傳 WebShell 位址
4. 透過 WebShell 執行 RCE,取得相關資訊
安全建議措施
- 升級 Spring Framework 至 5.3.18+ 或是 5.2.20+
- 升級 Spring Boot 及相關生態版本至 2.6.6+ 或是 2.5.12+
- 升級 Apache Tomcat 至 10.0.20+、9.0.62+ 或是 8.5.78+
- 降級至 Java 8
- 如不方便升級,可以在 Server/Application 前面部署相關 WAF Rules 來阻擋掉相關 Payload
Reference
- tweedge/springcore-0day-en
- CVE — CVE-2022–22965 (mitre.org)
- Spring Framework RCE, Early Announcement
- SpringShell RCE vulnerability: Guidance for protecting against and detecting CVE-2022–22965 — Microsoft Security Blog
- CVE-2022–22965 (SpringShell): RCE Vulnerability Analysis and Mitigations (paloaltonetworks.com)
- [漏洞複現] Spring4Shell: Spring Core RCE JDK 9+ CVE-2022–22965 » 資安這條路 (feifei.tw)
- [漏洞建立解說] 讓人進退兩難的春天漏洞~~??!!! 建立Docker Spring Core RCE (SpringShell) (CVE-2022–22965) 的漏洞環境 — YouTube