Veracode XML 外部实体引用 (XXE)

Veracode XML External Entity Reference (XXE)

我的 Veracode 报告中有下一个发现: XML 外部实体引用 ('XXE') 的不当限制 (CWE ID 611) 参考下面的下一个代码

...

  DocumentBuilderFactory dbf=null;      
  DocumentBuilder db = null;    
  try {         
        dbf=DocumentBuilderFactory.newInstance();  
        dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); 
        dbf.setExpandEntityReferences(false); 
        dbf.setXIncludeAware(false);        
        dbf.setValidating(false); 
        dbf.newDocumentBuilder();   
        InputStream stream = new ByteArrayInputStream(datosXml.getBytes());
        Document doc = db.parse(stream, "");            

...

我一直在研究,但我还没有找到这个发现的原因或让它消失的方法。 你能告诉我怎么做吗?

你见过the OWASP guide about XXE吗?

您没有禁用应禁用的 3 个功能。最重要的是第一个:

dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);

背景:

XXE 攻击是围绕 XML 语言功能构建的,使用外部数据类型定义 (DTD) 定义任意实体以及读取或执行文件的能力。

下面是包含 DTD 声明的 XML 文件的示例,处理时可能 return 本地“/etc/passwd”文件的输出:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE test [
    <!ELEMENT test ANY >
    <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>

缓解措施:

要避免利用 XEE 漏洞,最好的方法是禁用从外部源加载实体的能力。

现在禁用 DTD 的方式将根据所使用的语言(Java、C++、.NET)和正在使用的 XML 解析器(DocumentBuilderFactory、SAXParserFactory、TransformerFactory 命名一个很少有人考虑 java 语言)。

下面两个官方参考资料提供了有关如何实现相同目标的最佳信息。

https://rules.sonarsource.com/java/RSPEC-2755

https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.md