【发布时间】:2016-12-25 16:22:07
【问题描述】:
我看到我们可以使用 .setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true) 配置 XMLReader
此功能由以下内容记录:“用于安全处理的功能。true 指示实现安全地处理 XML。这可能会对 XML 构造设置限制,以避免出现拒绝服务攻击等情况。 "
我想用以下代码对其进行测试:
XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setContentHandler(handler);
reader.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
reader.parse(input);
并为其解析十亿次笑声攻击:
String DOS = new String("<?xml version=\"1.0\"?>\n<!DOCTYPE lolz [\n<!ENTITY lol \"lol\">\n<!ELEMENT lolz (#PCDATA)>\n<!ENTITY lol1 \"&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;\">\n<!ENTITY lol2 \"&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;\">\n<!ENTITY lol3 \"&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;\">\n<!ENTITY lol4 \"&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;\">\n<!ENTITY lol5 \"&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;\">\n<!ENTITY lol6 \"&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;\">\n<!ENTITY lol7 \"&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;\">\n<!ENTITY lol8 \"&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;\">\n<!ENTITY lol9 \"&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;\">\n]>\n<lolz>&lol9;</lolz>");
首先,我收到了 JAXP00010001 错误:消息:JAXP00010001:解析器在本文档中遇到了超过“64000”个实体扩展;这是 JDK 施加的限制。将 SECURE 功能设置为 false 时,错误是相同的。
所以我设置了 jvm 参数:-Djdk.xml.entityExpansionLimit=0,以禁用虚拟机的扩展限制。然后,在 SECURE_FEATURE 为 true 的情况下重新运行测试。
但是现在,当我运行程序时,它似乎并没有受到这种攻击的保护,它只是继续运行。
我在jdk1.8.0_60下运行。
谁能解释发生了什么? .setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true) 究竟做了什么?
【问题讨论】: