Как миллиард смеется над DoS-атакой XML?

<!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-атаки.

Кто-нибудь знает, как это работает?

Ответ 1

Атака Billion Laughs - это атака типа "отказ в обслуживании", предназначенная для парсеров XML. Атака Billion Laughs также известна как XML-бомба, или более эзотерически, экспансивная экспансия расширения сущности. Атака Billion Laughs может произойти даже при использовании хорошо сформированного XML и также может проходить проверку XML-схемы.

Атака с использованием Vanilla Billion Laughs проиллюстрирована в 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, lol - lol9. Первая сущность lol определяется как строка "lol". Однако каждый из других объектов определяется как 10 другого объекта. Раздел содержимого документа этого XML файла содержит ссылку только на один экземпляр объекта lol9. Однако, когда это анализируется парсером DOM или SAX, когда встречается lol9, он разлагается на 10 lol8 s, каждый из которых разложен на 10 lol7 s и т.д. И т.д. К тому времени, когда все будет расширен до текста lol, существует 100 000 000 экземпляров строки "lol". Если был еще один объект, или lol был определен как 10 строк "lol", то был бы Billion "lol" s, следовательно, имя атаки. Излишне говорить, что это множество расширений потребляет экспоненциальное количество ресурсов и времени, вызывая DOS.

Более подробное объяснение существует в моем блоге .

Ответ 2

Одна из XML-бомб - http://msdn.microsoft.com/en-us/magazine/ee335713.aspx

Теперь злоумышленник может использовать эти три свойства XML (объекты замещения, вложенные объекты и встроенные DTD) для создания вредоносной XML-бомбы. Злоумышленник пишет XML-документ с вложенными объектами, как и предыдущий пример, но вместо того, чтобы вложить только один уровень в глубину, он гнездится на своих объектах на много уровней...

Существует также код для защиты от этих "бомб" (в мире .NET):

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

Ответ 3

<!ENTITY ha "Ha !"> определяет объект &ha;, который расширяется до "Ha !". Следующая строка определяет другой объект, &ha2;, который расширяется до "&ha; &ha;" и, в конечном итоге, "Ha ! Ha !".

&ha3; превращается в Ha ! Ha ! Ha ! Ha ! и т.д., удваивая число каждый раз. Если вы следуете шаблону, &haN; - это "Ha !", 2 N-1 times, поэтому &ha128, расширяется до 2 127"Ha !" s, что слишком большой для любого компьютера.

Ответ 4

Он пишет: "Ха!" 2 128 раз.