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,他还协助开发和测试了解决方案。