CVE-2015-3192 透過 XML 輸入進行 DoS 攻擊

| 2015 年 6 月 30 日 | CVE-2015-3192

描述

XML 外部實體在釋出 http://pivotal.io/security/cve-2013-6429 時已停用。如果 DTD 未完全停用,則可以使用內聯 DTD 宣告進行拒絕服務攻擊,即所謂的 XML 炸彈。根據 XML 模式規則,此類宣告格式良好且有效,但解析時可能導致記憶體不足錯誤。為防禦此類攻擊,必須透過在 DOM 和 SAX API 中將 disallow-doctype-dec 特性設定為 true,並在 StAX API 中將 supportDTD 屬性設定為 false 來停用 DTD 支援。

現在,只要框架從外部源設定 XML 解析,Spring Framework 就會預設執行此操作。主要包括 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 -- 當類路徑中存在“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 包含了必要的服務定義,因此簡單地將其新增到類路徑中應該就可以工作。然而,某些應用伺服器(如 WebLogic)已經捆綁了 Woodstox 的(舊版本),在這種情況下,您可能需要配置伺服器以優先使用應用程式選擇的版本,請參閱此 關於 prefer-application-packages 的參考

鳴謝

該問題由 NTT DATA Corporation 的 Toshiaki Maki 負責任地發現並報告給 Pivotal,他也協助開發和測試瞭解決方案。

參考資料

歷史記錄

2015 年 6 月 30 日:首次釋出漏洞報告。

領先一步

VMware 提供培訓和認證,助您快速提升。

瞭解更多

獲取支援

Tanzu Spring 在一項簡單的訂閱中提供對 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將舉行的活動

檢視 Spring 社群中所有即將舉行的活動。

檢視全部