2.7.4. 配置文档强制
XML 文档解析器受到 XXE(XML eXternal Entity)攻击,其中扩展外部实体会导致加载不安全的文件。例如,以下文档可能会导致加载 /etc/passwd
文件:
<!--?xml version="1.0"?--> <!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]> <search> <user>bill</user> <file>&xxe;<file> </search>
默认情况下,org.w3c.dom.Document
文档的 RESTEasy 内置 unmarshaller 不扩展外部实体。它将它们替换为空字符串。您可以将其配置为将外部实体替换为 DTD 中定义的值。这可以通过在 web.xml 文件中将
上下文参数设置为 resteasy.document.expand.entity.
referencestrue
来实现。
示例:设置 resteasy.document.expand.entity.references
上下文参数
<context-param> <param-name>resteasy.document.expand.entity.references</param-name> <param-value>true</param-value> </context-param>
另一种解决问题的方法是禁止 DTD,RESTEasy 默认这样做。可以通过将 resteasy.document.secure.disableDTDs
上下文参数设置为 false
来更改此行为。
示例:设置 resteasy.document.secure.disableDTDs
Context Parameter
<context-param> <param-name>resteasy.document.secure.disableDTDs</param-name> <param-value>false</param-value> </context-param>
当缓冲区被大型实体超额或太多属性时,文档也会受到服务攻击的 Denial 服务攻击的影响。例如,如果 DTD 定义了以下实体,则 &foo6 的扩展会导致
1,000,000 foos。
<!--ENTITY foo 'foo'--> <!--ENTITY foo1 '&foo;&foo;&foo;&foo;&foo;&foo;&foo;&foo;&foo;&foo;'--> <!--ENTITY foo2 '&foo1;&foo1;&foo1;&foo1;&foo1;&foo1;&foo1;&foo1;&foo1;&foo1;'--> <!--ENTITY foo3 '&foo2;&foo2;&foo2;&foo2;&foo2;&foo2;&foo2;&foo2;&foo2;&foo2;'--> <!--ENTITY foo4 '&foo3;&foo3;&foo3;&foo3;&foo3;&foo3;&foo3;&foo3;&foo3;&foo3;'--> <!--ENTITY foo5 '&foo4;&foo4;&foo4;&foo4;&foo4;&foo4;&foo4;&foo4;&foo4;&foo4;'--> <!--ENTITY foo6 '&foo5;&foo5;&foo5;&foo5;&foo5;&foo5;&foo5;&foo5;&foo5;&foo5;'-->
默认情况下,RESTEasy 限制各个实体的扩展数和属性数量。确切的行为取决于底层解析器。可以通过将 resteasy.document.secure.process.feature
上下文参数设置为 false
来关闭限制。
示例:设置 resteasy.document.secure.process.feature
Context Parameter
<context-param> <param-name>resteasy.document.secure.processing.feature</param-name> <param-value>false</param-value> </context-param>