En seguridad informática , un ataque de mil millones de risas es un tipo de ataque de denegación de servicio (ataque DoS) dirigido a analizadores de documentos XML . [ 1 ]
También se le conoce como bomba XML o ataque de expansión exponencial de entidades. [ 2 ]
Detalles
El ejemplo de ataque consiste en definir 10 entidades, cada una compuesta por 10 copias de la entidad anterior. El documento resultante consta de una única instancia de la entidad más grande, que se expande hasta generar mil millones de copias de la primera entidad. También existen versiones con mayor cantidad de entradas.
En el ejemplo más citado, la primera entidad es la cadena " lol ", de ahí el nombre "mil millones de risas". En el momento en que se informó por primera vez de esta vulnerabilidad, la memoria del ordenador utilizada por mil millones de instancias de la cadena "lol" probablemente superaría la disponible para el proceso que analiza el XML.
Aunque la forma original del ataque estaba dirigida específicamente a los analizadores XML, el término también puede aplicarse a temas similares. [ 1 ]
El problema se informó por primera vez ya en 2002, [ 3 ] pero comenzó a abordarse ampliamente en 2008. [ 4 ]
Entre las medidas de defensa contra este tipo de ataque se incluyen limitar la memoria asignada a un analizador individual si la pérdida del documento es aceptable, o tratar las entidades simbólicamente y expandirlas de forma diferida solo cuando (y en la medida en que) se vaya a utilizar su contenido.
Ejemplo de código
< ? xml version= "1.0" ? > <!DOCTYPE lolz [ <!ELEMENT lolz ( #PCDATA ) > <!ENTITY lol1 "lollollollollollollollollol" > <!ENTITY lol2 "&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;" > <!ENTIDAD lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;" > <!ENTIDAD lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;" > <!ENTIDAD lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;" > <!ENTIDAD lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;" > <!ENTITY jajaja9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;" > ]> <lolz > &lol9; </lolz>Cuando un analizador XML carga este documento, ve que incluye un elemento raíz, "lolz", que contiene el texto " & lol9;". Sin embargo, " & lol9;" es una entidad definida que se expande a una cadena que contiene diez cadenas " & lol8;". Cada cadena " & lol8;" es una entidad definida que se expande a diez cadenas " & lol7;", y así sucesivamente. Después de que se hayan procesado todas las expansiones de entidades, este pequeño bloque de XML (< 1 KB) contendrá en realidad 10⁹ = mil millones de "lol", ocupando casi 3 gigabytes de memoria. [ 2 ]
Variaciones
El ataque de mil millones de risas descrito anteriormente puede consumir una cantidad exponencial de espacio o tiempo. La variación de explosión cuadrática provoca un crecimiento cuadrático en los requisitos de recursos al repetir una entidad grande una y otra vez, para evitar contramedidas que detectan entidades altamente anidadas. [ 5 ] (Véase la teoría de la complejidad computacional para comparaciones de diferentes clases de crecimiento).
Podría existir un ataque de "mil millones de risas" para cualquier formato de archivo que pueda contener expansiones de macros, 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 ]Esto provocaba fallos en versiones anteriores de Go porque el procesador YAML de Go (contrariamente a la especificación YAML) expandía las referencias como si fueran macros. El procesador YAML de Go se modificó para que fallara el análisis si el objeto resultante era demasiado grande.
El software empresarial como Kubernetes se ha visto afectado por este ataque a través de su analizador YAML. [ 6 ] [ 7 ] Por esta razón, se prefiere un analizador con capacidades intencionadamente limitadas (como StrictYAML) o formatos de archivo que no permiten referencias para los datos que llegan de fuentes no confiables. [ 8 ]
Véase también
- Definición de tipo de documento : conjunto de declaraciones de marcado para el lenguaje de marcado de la familia SGML (DTD), una plantilla para validar archivos XML.
- Bomba de bifurcación : tipo de ataque de denegación de servicio , un método similar para agotar los recursos de un sistema mediante recursión.
- Recursión : proceso de repetir elementos de forma autosimilar.
- Ataque de entidad externa XML : tipo de ataque a sistemas informáticos
- Bomba Zip : archivo comprimido malicioso diseñado para interrumpir el programa o sistema que lo lee ; un ataque similar que utiliza archivos zip.
Referencias
- 1 2 Harold, Elliotte Rusty (27 de mayo de 2005). "Consejo: Configure los analizadores SAX para un procesamiento seguro" . IBM developerWorks . Archivado del original el 5 de octubre de 2010. Recuperado el 4 de marzo de 2011 .
- 1 2 Sullivan, Bryan (noviembre de 2009). "Ataques y defensas de denegación de servicio XML" . Revista MSDN . Microsoft Corporation . Recuperado el 31 de mayo de 2011 .
- ↑ "SecurityFocus" . 16 de diciembre de 2002. Archivado del original el 16 de abril de 2021. Consultado el 3 de julio de 2015 .
- ↑ "CVE-2003-1564" . Vulnerabilidades y exposiciones comunes . The MITRE Corporation. 2 de febrero de 2003. Consultado el 1 de junio de 2011 .
- ↑ "19.5. Módulos de procesamiento XML — Documentación de Python 2.7.18" .
- ↑ "CVE-2019-11253: El análisis JSON/YAML del servidor API de Kubernetes es vulnerable a un ataque de agotamiento de recursos · Problema n.° 83253 · kubernetes/Kubernetes" . GitHub .
- ↑ Wallen, Jack (9 de octubre de 2019). "La vulnerabilidad 'Billion Laughs' de Kubernetes no es cosa de risa" . The New Stack .
- ↑ "XML está acabado, ¡viva JSON!" 9 de junio de 2016.
- Ataques a la complejidad algorítmica
- ataques de denegación de servicio
- XML