亿笑XML DoS攻击如何工作?

<!DOCTYPE root [ <!ENTITY ha "Ha !"> <!ENTITY ha2 "&ha; &ha;"> <!ENTITY ha3 "&ha2; &ha2;"> <!ENTITY ha4 "&ha3; &ha3;"> <!ENTITY ha5 "&ha4; &ha4;"> ... <!ENTITY ha128 "&ha127; &ha127;"> ]> <root>&ha128;</root> 

据说这被称为十亿大笑DoS攻击。

有谁知道它是如何工作的?

十亿笑攻击是针对XMLparsing器的拒绝服务攻击。 亿笑攻击也被称为XML炸弹,或者更为深奥的指数实体扩展攻击。 即使使用格式良好的XML,也可能发生十亿个笑的攻击,并且还可以通过XML模式validation。

在以下所示的XML文件中说明了“香草十亿笑”攻击。

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

在这个例子中,有10个不同的XML实体, lollol9 。 第一个实体, lol被定义为string“lol” 。 但是,其他实体都被定义为另一个实体的10个实体。 该XML文件的文档内容部分仅包含对实体lol9一个实例的lol9 。 但是,当DOM或SAXparsing器正在parsing这个问题时,当遇到lol9时,它将被扩展为10个lol8 ,每个lol8被扩展为10个lol7 ,等等。 当所有的东西都扩展到文本lol ,就有100,000,000个string"lol"实例。 如果还有一个实体,或者说lol被定义为10个“lol”string,就会有一个十亿个“lol”,因此就是攻击的名字。 不用说,这么多的扩展消耗了大量的资源和时间,导致了DOS。

我的博客上有更广泛的解释。

其中一个XML炸弹 – http://msdn.microsoft.com/en-us/magazine/ee335713.aspx

攻击者现在可以利用XML的这三个属性(replace实体,嵌套实体和内联DTD)来制作恶意的XML炸弹。 攻击者像前面的例子一样用嵌套的实体写一个XML文档,而不是嵌套一层深度,而是嵌套他的实体很多层次。

也有代码来保护这些“炸弹”(在.NET世界):

 XmlReaderSettings settings = new XmlReaderSettings(); settings.ProhibitDtd = false; settings.MaxCharactersFromEntities = 1024; XmlReader reader = XmlReader.Create(stream, settings); 

<!ENTITY ha "Ha !">定义了一个实体, &ha; 扩展到"Ha !" 。 下一行定义了另一个实体&ha2; 扩展到"&ha; &ha;" 最后, "Ha ! Ha !"

&ha3; 变成Ha ! Ha ! Ha ! Ha ! Ha ! Ha ! Ha ! Ha ! 等等,每次翻倍。 如果你遵循这个模式, &haN;"Ha !" ,2 N-1次,所以扩大到2 127 "Ha !" 这对于任何电脑来说都太大了。

它写道“哈!” 2 128次。