CVE-2015-3192 使用 XML 輸入的 DoS 攻擊
描述
XML 外部實體在釋出 http://pivotal.io/security/cve-2013-6429 時已被停用。如果 DTD 未完全停用,則內聯 DTD 宣告可用於執行被稱為 XML 炸彈的拒絕服務攻擊。此類宣告根據 XML schema 規則格式正確且有效,但解析時可能導致記憶體不足錯誤。為防禦此類攻擊,必須停用 DTD 支援,方法是在 DOM 和 SAX API 中將 disallow-doctype-dec 特性設定為 true,並在 StAX API 中將 supportDTD 屬性設定為 false。
現在,Spring Framework 在框架設定從外部源解析 XML 的所有地方預設執行此操作。這主要包括 spring-oxm
中的 Unmarshaller
實現和 spring-web
中的 HttpMessageConverter
實現。
請注意,應用可能需要採取進一步措施,尤其是在使用 StAX 的情況下。例如,IBM JDK 1.6 和 1.7 除了設定 supportDTD=false 之外,還需要一個環境變數(參見 IBM JDK 參考)。此外,我們發現單獨的 supportDTD 並不能防禦 JDK JAXP 實現中的所有型別的 DoS 攻擊。因此,我們建議使用 Woodstox 開源庫進行 StAX 解析。
以下描述了何時在 Spring Framework 中使用 StAX
SourceHttpMessageConverter
-- 預設啟用。該轉換器在 3.2 中新增,而 StAX 支援在 4.0.1 中新增,用於轉換為型別為javax.xml.transform.stax.StAXSource
的 Spring MVC 控制器方法引數。Jaxb2CollectionHttpMessageConverter
-- 預設不啟用。此轉換器在 3.2 中新增。MappingJackson2XmlHttpMessageConverter
-- 當 classpath 中存在“jackson-dataformat-xml”時啟用。此轉換器在 4.1 中新增。
受影響的 Spring 產品和版本
- Spring Framework 3.2.0 到 3.2.13
- Spring Framework 4.0.0 到 4.1.6
- 其他不受支援的版本也受到影響
緩解措施
受影響的 Spring Framework 版本的使用者應按如下方式升級
- 對於 3.2.x 版本,升級到 3.2.14+
- 對於 4.0.x 和 4.1.x 版本,升級到 4.1.7+
此外,透過 StAX 消費外部來源的 XML 輸入的應用程式也應使用和/或升級到 Woodstox 庫的最新版本,例如 4.2+ 版本(4.2.1 是 Spring IO Platform 中當前託管的版本)。
關於新增 Woodstox 的說明
StAX 定義了一種標準機制,用於在存在多個 StAX 實現時選擇使用哪個實現,包括 WEB-INF/services 下的系統屬性和服務定義。Woodstox 包含必要的服務定義,因此只需將其新增到 classpath 中即可使用。然而,某些應用伺服器(例如 WebLogic)已經捆綁了 Woodstox 的(舊版本),在這種情況下,您可能需要配置伺服器以優先使用應用程式選擇的版本,請參閱此prefer-application-packages 參考。
鳴謝
此問題由 NTT DATA Corporation 的 Toshiaki Maki 負責任地發現並報告給 Pivotal,他還協助開發和測試瞭解決方案。