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.XML vulnerabilities in Python (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

Categoría:Ataques de denegación de servicio Categoría:XML