描述
XML 外部实体之前已在发布http://pivotal.io/security/cve-2013-6429 时禁用。如果 DTD 未完全禁用,则可以使用内联 DTD 声明执行称为 XML 炸弹的拒绝服务攻击。此类声明在 XML 模式规则下既格式良好又有效,但在解析时会导致内存不足错误。为了防止此类攻击,必须通过在 DOM 和 SAX API 中将disallow-doctype-dec 功能设置为**true**以及在 StAX API 中将supportDTD 属性设置为**false**来禁用 DTD 支持。
现在,在 Spring Framework 中默认情况下,在框架从外部源设置 XML 解析的任何地方都执行此操作。主要包括spring-oxm
中的Unmarshaller
实现和spring-web
中的HttpMessageConverter
实现。
请注意,应用程序可能需要采取进一步措施,尤其是在涉及 StAX 用法的情况下。例如,IBM JDK 1.6 和 1.7 除了设置 supportDTD=false 之外,还需要环境变量(请参阅 IBM JDK 参考 )。此外,我们发现仅使用 supportDTD 无法防止使用 JDK JAXP 实现的所有类型的拒绝服务攻击。因此,我们建议使用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,升级到<strong>3.2.14+</strong> 对于 4.0.x 和 4.1.x,升级到<strong>4.1.7+</strong>
此外,通过 StAX 从外部来源使用 XML 输入的应用程序也应该使用和/或升级到 Woodstox 库的最新版本,例如 4.2+ 版本(4.2.1 是当前在 Spring IO 平台 中维护的版本)。
添加 Woodstox 的说明
StAX 定义了一种标准机制,用于在有多个 StAX 实现可用时选择使用哪个实现,包括系统属性和 WEB-INF/services 下的服务定义。Woodstox 包含必要的服务定义,因此只需将其添加到类路径中即可。但是,某些应用服务器(例如 WebLogic)已经捆绑了(旧版本的)Woodstox,在这种情况下,您可能需要配置服务器以优先使用应用程序选择的版本,请参阅此 关于 prefer-application-packages 的参考 。
鸣谢
NTT DATA Corporation 的 Maki Toshiaki 负责任地识别并向 Pivotal 报告了此问题,他还帮助开发和测试了解决方案。
参考