SV.XXE.TF

XML 外部エンティティ攻撃の可能性

このエラーは、脆弱に構成された XML パーサーである TransformerFactory によって XML 入力が処理されるときに発生します。

脆弱性とリスク

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 パーサー「TransformerFactory」によって XML 入力が処理されることを示しています。

修正コード例

コピー
   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();
      }
  }