Как работает миллиард смеха DoS-атака XML? - PullRequest
53 голосов
/ 10 августа 2010
<!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-атакой на миллиард смеха.

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

Ответы [ 3 ]

60 голосов
/ 15 июля 2012

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

Ванильная атака 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 с, каждый из которых расширяется до 10 lol7 с, и так далее, и так далее. К тому времени, когда все расширится до текста lol, в строке будет * 100 000 000 экземпляров "lol". Если бы была еще одна сущность или lol был определен как 10 строк из “lol”, был бы миллиард «лол», отсюда и название атаки. Излишне говорить, что это множество расширений потребляет экспоненциальное количество ресурсов и времени, вызывая DOS.

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

21 голосов
/ 10 августа 2010

Одна из бомб 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);
12 голосов
/ 10 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...