Mil millones de risas

En la seguridad informática, un ataque de mil millones de risas es un tipo  de ataque de denegación-de-servicio (DoS) que apunta a parsers de documentos XML.

Es también referido a como una bomba de XML o como un ataque de expansión de entidad exponencial.

Detalles 
El ataque de ejemplo consta de definir 10 entidades, cada cual definida como constando de 10 de la entidad anterior, con el documento que consiste en una sola instancia de la entidad mayor, el cual se expande a mil millones de copias de la primera entidad.

En el ejemplo citado más frecuentemente, la primera entidad es el texto  "lol", por ello el nombre "mil millones de risas". La cantidad de memoria de ordenador usada probablemente superaría a la disponible para el proceso de parseo del XML (ciertamente lo fue en el tiempo cuando la vulnerabilidad fue informada por primera vez).

Mientras la forma original del ataque estuvo apuntada específicamente a XML parsers, el término puede ser aplicable a temas similares también.

El problema fue reportado por primera vez en 2002, pero empezó para ser ampliamente dirigido en 2008.

Las defensas contra esta clase de ataque incluyen limitar la memoria destinada en un parser individual si la pérdida del documento es aceptable, o tratar entidades simbólicamente y expandiéndolas perezosamente sólo cuándo (y en la medida que) su contenido requiera ser utilizado.

Ejemplo de código 
<?xml version="1.0"?>
<!DOCTYPE lolz [
 <!ENTITY lol "lol">
 <!ELEMENT lolz (#PCDATA)>
 <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
 <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
 <!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>
Cuando un parser XML carga este documento,  ve que  incluye un elemento raíz, "lolz", aquello contiene el texto "&lol9;". Sin embargo, "&lol9;" es una entidad definida que se expande a un texto que contiene diez textos "&lol8;". Cada texto "&lol8;" es una entidad definida  que expande a diez textos "&lol7;", y así. Después de que todas las expansiones de entidad han sido procesadas, este pequeño (< 1 KB) bloque de XML de hecho contendrá 109 = mil millones de "lol"s, usando casi 3 gigabytes de memoria.

Variaciones 
El ataque de mil millones de risas descrito más arriba toma una cantidad exponencial de espacio. La variación de explosión cuadrática  causa crecimiento cuadrático en requisitos de almacenamiento sencillamente repitiendo una entidad grande una y otra vez, para evitar contramedidas que detectan entidades fuertemente anidados.  (Ver teoría de complejidad computacional para comparaciones de clases de crecimiento diferente.)

Un ataque de mil millones de risas existe para cualquier formato de archivo que pueda contener referencias, por ejemplo esta bomba YAML:

a: &a ["lol","lol","lol","lol","lol","lol","lol","lol","lol"]
b: &b [*a,*a,*a,*a,*a,*a,*a,*a,*a]
c: &c [*b,*b,*b,*b,*b,*b,*b,*b,*b]
d: &d [*c,*c,*c,*c,*c,*c,*c,*c,*c]
e: &e [*d,*d,*d,*d,*d,*d,*d,*d,*d]
f: &f [*e,*e,*e,*e,*e,*e,*e,*e,*e]
g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f]
h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g]
i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h]

Véase también 
 Bomba de bifurcación: un método similar para agotar los recursos de un sistema a través de recursión
 Bomba zip: un ataque similar que utiliza archivos comprimidos
 ataque de entidad XML externa: un ataque de XML para retornar archivos arbitrarios de servidor

Referencias 

Ataques de denegación de servicio
XML