XML Billion-Laughs-Attack

XML Billion-Laughs-Attack

Existen múltiples ataques en XML que recurrentemente aparecen cuando auditamos aplicaciones que utilicen este tipo de documentos. Lo anterior se debe a que posiblemente los módulos utilizados para el procesamiento de documentos no sean seguros contra datos construidos de forma maliciosa o simplemente tienen una mala configuración. Un actor malicioso podría abusar de las funciones XML para llevar a cabo ataques de denegación de servicio, acceder a archivos lógicos, generar conexiones de red a otros equipos o evadir firewalls.

Uno de los ataques más conocidos es XML Billion-Laughs-Attack,  que causa una denegación de servicio (DoS) en los analizadores de documentos XML.


¿Cómo funciona?

Antes de explicar el funcionamiento del ataque, es importante mencionar como trabaja una entidad XML: es una representación simbólica de información, como una variable en un programa de computadora. Se declara en el Document Type Definition (DTD) siguiendo la sintaxis:

<!ENTITY nombreEntidad “Texto que aparece cuando se utiliza la entidad”>

El siguiente código es un ejemplo de una implementación:

<?xml version=”1.0″ encoding=”utf-8″?>

<!DOCTYPE lolz [

<!ENTITY lol lol“>

<!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>

Se observa que la primera entidad lol es declarada con el texto “lol” y en la segunda entidad declarada (lol1) se hacen 10 referencias a la anterior. En este ejemplo, el documento contiene la declaración de 10 entidades y cada una de ellas hace referencia 10 veces a la precedente, por lo que el documento cargará mil millones de copias de la primera entidad.

Como el documento cargará mil millones de copias de la primera entidad, la computadora excederá la memoria disponible para el proceso que analiza el documento XML, lo que provocará un ataque de denegación de servicio.


Ejemplo de ataque

El ataque hará uso del sitio vulnerable ACME, en el que se observó el uso de documentos XML para procesos internos y la generación de un PDF, donde al final se verían reflejadas las referencias a las entidades. A continuación, el formulario de datos a llenar en dicho sitio:

 

Después del llenado de los datos del formulario, se realizó el envío de la petición. Utilizando una herramienta HTTP Proxy, al interceptar la petición se observó el parámetro data, el cual se envía utilizando codificación URL.

 

Al decodificar el contenido del parámetro data utilizado URL decoding, se observó una estructura JSON, en la cual se encuentran los datos enviados en el formulario Web mostrado anteriormente. De igual forma, se observó que el contenido del parámetro JSON xmldeclaracion no era legible.

 

 

Posteriormente, se extrajo el contenido del parámetro JSON xmldeclaracion. Al analizarlo se determinó que utilizaba codificación base64, y al decodificarlo se observó que se trataba de una estructura XML.

 

 

Utilizando la estructura de ejemplo que se mencionó al inicio, se insertó el siguiente código para realizar la declaración de la entidad. En este caso, para evitar colapsar la aplicación auditada se, declararon dos entidades, con tres referencias cada una.

 

<!DOCTYPE lolz [

<!ENTITY lol lol“>

<!ENTITY lol1 &lol;&lol;&lol;“>

<!ENTITY lol2 &lol1;&lol1;&lol1;“>

]>

 

Para poder realizar la referencia a la entidad, se utilizó el campo “Observaciones”, en el que se verá reflejada la impresión de las entidades.

 

Una vez modificado el documento XML con la referencia y declaración de las entidades, se codificó nuevamente en base64.

 

 

Como medida para verificar la integridad del documento XML, el aplicativo incluía (en la estructura JSON de la petición realizada al guardar los datos), un parámetro JSON “validador” que tiene como valor el base64 del HASH SHA-256 del documento XML.

Para cumplir con la validación que realizaba el sitio, se obtuvo el nuevo HASH SHA-256 y el base64 correspondiente a dicho HASH.

 

Se sustituyó el base64 del XML original por el modificado en la estructura JSON de la petición.

De igual forma, se sustituyó el base64 del HASH SHA-256 del documento XML original por el calculado anteriormente.

 

 

Y se volvió a codificar toda la estructura JSON utilizando URL encoding.

 

 

Luego se sustituyó toda la cadena en la petición interceptada.

 

 

Finalmente, al realizar el envío de la petición al aplicativo, se observó que en el campo donde se referenciaron las entidades (“Observaciones”), se generó el PDF incluyendo la referencia a las entidades declaradas.


¿Cómo protegernos de este tipo de ataque?

Para evitar este y otro tipos de ataques que deriven de XML, es importante seguir reglas de codificación segura y buenas prácticas de programación. A continuación, se mencionan algunas de ellas:

  • Limitar la cantidad de nodos de referencia de entidades que el analizador puede procesar.
  • Limitar la cantidad de caracteres hasta los que la entidad puede expandirse.
  • No permitir Document Type Definition.
  • Evitar resolver entidades XML En caso de no ser necesarias, considerar deshabilitarlas en la configuración del procesador XML.
  • Limitar el tamaño de entrada total.
  • Limitar el tiempo de análisis.
  • Utilizar analizadores SAX o similares para procesamiento de datos grandes.

Referencias:

https://owasp.org/www-pdf-archive/XML_Based_Attacks_-_OWASP.pdf