SV.XXE.TF

XML 外部实体攻击的可能性

当 XML 输入由配置较弱的 XML 分析程序 TransformerFactory 处理时,会发生此错误。

漏洞与风险

XML 外部实体攻击是一种针对解析 XML 输入的应用程序的攻击。当包含对外部实体进行引用的 XML 输入由配置较弱的 XML 分析程序处理时,会发生此攻击。这种攻击可能导致机密数据泄露、拒绝服务、服务器端请求伪造、从分析程序所在机器的角度进行端口扫描,或其他系统影响。

缓解与预防

防止 XML 外部实体攻击的最安全方法是始终完全禁用 DTD(外部实体)。根据分析程序的不同,方法可能会有所不同。例如,可以使用以下技术来配置 DocumentBuilderFactory XML 分析程序,以此保护分析程序远离 XML 外部实体攻击:

复制
   DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
   ...
   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);
   ...

漏洞代码示例

复制
   import javax.xml.transform.TransformerFactory;
   
   public class Test {
       public void test1() {
           TransformerFactory tf = TransformerFactory.newInstance();
           tf.newTransformer();
       }
   }

在此示例中,Klocwork 报告第 5 行出现 SV.XXE.TF 错误,这表示 XML 输入由配置较弱的 XML 分析程序 TransformerFactory 处理。

修正代码示例

复制
   import javax.xml.transform.TransformerFactory;
   
   public class Test {
       public void test1() {
           TransformerFactory tf = TransformerFactory.newInstance();
   
           tf.setAttribute("http://javax.xml.XMLConstants/property/accessExternalDTD", "");
           tf.setAttribute("http://javax.xml.XMLConstants/property/accessExternalSchema", "");
           tf.setAttribute("http://javax.xml.XMLConstants/property/accessExternalStylesheet", "");
  
        tf.newTransformer();
      }
  }

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。