CS.XXE.READER

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

CS.XXE.READER チェッカーは、脆弱に構成された XmlReader パーサーによって処理される XML 入力のインスタンスにフラグを立てます。

脆弱性とリスク

XML 外部エンティティ攻撃は、XML 入力を解析するアプリケーションに対する一種の攻撃です。この攻撃は、外部エンティティへの参照を含む XML 入力が、脆弱に構成された XML パーサーによって処理されるときに発生します。この攻撃により、機密データの開示、サービスの拒否、サーバー側のリクエスト偽造、パーサーが配置されているマシンの視点からのポートスキャンなどの、システムへの影響が発生する可能性があります。

軽減と防止

XXE 攻撃を防ぐ最も安全な方法は、DTD (外部エンティティ) を完全に無効にすることです。パーサーによっては、メソッドが異なる場合があります。たとえば、.NET 4.5.2+ では、XmlReader は DTD をデフォルトで無効にしており、DtdProcessing = Parse であり XmlResolver が null でない場合に、安全でなくなる可能性があります。

脆弱コード例

コピー
  static void LoadXML()
  {
      string xxePayload = "<!DOCTYPE doc [<!ENTITY win SYSTEM 'file:///C:/Users/SecretData.txt'>]>" + "<doc>&win;</doc>";
      string xml = "<?xml version='1.0' ?>" + xxePayload;
   
      XmlReaderSettings settings = new XmlReaderSettings(); // XmlReaderSettings processes Dtd and 
                                                          // uses a non-null XmlResolver, so it is unsafe.
      settings.DtdProcessing = DtdProcessing.Parse;
      settings.XmlResolver = new XmlUrlResolver();
      XmlReader reader = XmlReader.Create(xml, settings);
     while (reader.Read())
     { ...}
 }

修正コード例

コピー
  static void LoadXML() {
      string xxePayload = "<!DOCTYPE doc [<!ENTITY win SYSTEM 'file:///C:/Users/SecretData.txt'>]>" + "<doc>&win;</doc>";
      string xml = "<?xml version='1.0' ?>" + xxePayload;
   
      XmlReaderSettings settings = new XmlReaderSettings(); // Using the default safe settings
      XmlReader reader = XmlReader.Create(xml, settings);
      while (reader.Read())
      { ...}
  }

関連チェッカー