stringtranslate.com

Ataque de mil millones de risas

En seguridad informática , el ataque de mil millones de risas es un tipo de ataque de denegación de servicio (DoS) que está dirigido a los analizadores de documentos XML . [1]

También se le conoce como bomba XML o como ataque de expansión de entidad exponencial. [2]

Detalles

El ataque de ejemplo consiste en definir 10 entidades, cada una definida como compuesta por 10 de la entidad anterior, y el documento consiste en una única instancia de la entidad más grande, que se expande a mil millones de copias de la primera entidad.

En el ejemplo más citado, la primera entidad es la cadena " lol ", de ahí el nombre "billion laughs". En el momento en que se informó por primera vez sobre esta vulnerabilidad, la memoria de la computadora utilizada por mil millones de instancias de la cadena "lol" probablemente superaría la disponible para el proceso que analiza el XML.

Si bien la forma original del ataque estaba dirigida específicamente a los analizadores XML, el término puede aplicarse también a temas similares. [1]

El problema se informó por primera vez en 2002, [3] pero comenzó a abordarse ampliamente en 2008. [4]

Las defensas contra este tipo de ataque incluyen limitar la memoria asignada en 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  [  <!ENTIDAD  lol  "lol" >  <!ELEMENT  lolz  ( #PCDATA ) >  <!ENTIDAD  lol1  "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;" >  <!ENTIDAD  lol2  "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;" >  <!ENTIDAD  lol3  "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;" >  <!ENTIDAD  lol4  "&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;" >  <!ENTIDAD  lol7  "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;" >  <!ENTITY  jajaja8  "&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. Una vez que se han procesado todas las expansiones de entidades, este pequeño bloque (< 1 KB) de XML contendrá en realidad 10 9 = mil millones de "lol", ocupando casi 3 gigabytes de memoria. [5]

Variaciones

El ataque de mil millones de risas descrito anteriormente puede ocupar una cantidad exponencial de espacio o tiempo. La variación de explosión cuadrática provoca un crecimiento cuadrático de los requisitos de recursos simplemente repitiendo una entidad grande una y otra vez, para evitar contramedidas que detecten entidades muy anidadas. [6] (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 [ "jajajaja" , "jajajaja" , " jajajaja " , " jajajaja" , " jajajaja " , " jajajaja" ] b : &b [ *a , *a , * a , * a , *a , * a , *a , *a ] c : &c [ *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 , *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 provocó el bloqueo de versiones anteriores de Go porque el procesador YAML de Go (al contrario de la especificación YAML) expande las referencias como si fueran macros. El procesador YAML de Go se modificó para que no pueda analizar si el objeto resultante se vuelve demasiado grande.

El software empresarial como Kubernetes se ha visto afectado por este ataque a través de su analizador YAML. [7] [8] Por este motivo, se prefiere un analizador con capacidades intencionalmente limitadas (como StrictYAML) o se prefieren formatos de archivo que no permitan referencias para los datos que llegan de fuentes no confiables. [9] [ verificación fallida ]

Véase también

Referencias

  1. ^ ab Harold, Elliotte Rusty (27 de mayo de 2005). "Sugerencia: configure los analizadores SAX para un procesamiento seguro". IBM developerWorks . Archivado desde el original el 5 de octubre de 2010. Consultado el 4 de marzo de 2011 .
  2. ^ Sullivan, Bryan (noviembre de 2009). "Ataques y defensas de denegación de servicio XML". Revista MSDN . 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". Vulnerabilidades y exposiciones comunes . The MITRE Corporation. 2003-02-02 . Consultado el 2011-06-01 .
  5. ^ Bryan Sullivan. "Ataques y defensas contra denegación de servicio XML" . Consultado el 21 de diciembre de 2011 .
  6. ^ "19.5. Módulos de procesamiento XML — Documentación de Python 2.7.18".
  7. ^ "CVE-2019-11253: Análisis de JSON/YAML del servidor API de Kubernetes vulnerable a ataques de agotamiento de recursos · Problema n.° 83253 · kubernetes/Kubernetes". GitHub .
  8. ^ Wallen, Jack (9 de octubre de 2019). "La vulnerabilidad 'Billion Laughs' de Kubernetes no es motivo de risa". The New Stack .
  9. ^ "XML está acabado, larga vida a JSON". 9 de junio de 2016.