1. Descripción técnica del ataque
Billion Laughs Attack es una forma de Denegación de Servicio (DoS) que explota cómo los analizadores XML interpretan las entidades internas definidas en una DTD (Document Type Definition).
El ataque se basa en crear entidades recursivas que se expanden exponencialmente durante el procesamiento, provocando un consumo masivo de memoria y CPU hasta que el servidor deja de responder.
Ejemplo de payload:
<?xml version="1.0"?>
<!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;">
]>
<attack>&lol3;</attack>Expansión exponencial:
lol="lol"→ 3 caractereslol1= 10 ×lol→ 30 caractereslol2= 10 ×lol1→ 300 caractereslol3= 10 ×lol2→ 3.000 caracteres
Si el payload continúa anidando entidades, la expansión puede crecer hasta miles de millones de veces (de ahí su nombre “Billion Laughs”). Esta explosión combinatoria agota los recursos del sistema, provocando un colapso del servicio o caída total del proceso.
1.1 Relación con XXE
El Billion Laughs se considera una variante o subclase de ataques XXE (XML External Entity), en el sentido amplio de que ambos abusan del procesamiento de entidades en XML. Sin embargo, conviene diferenciar:
Billion Laughs (Entity Expansion DoS):
- Abusa de entidades internas y su expansión recursiva para crear una explosión exponencial de datos en memoria.
- Objetivo principal: Denegación de servicio (agotamiento de recursos — memoria/CPU), no exfiltración.
XXE clásico (exfiltración / SSRF / lectura de archivos):
- Abusa de entidades externas (por ejemplo,
<!ENTITY pwned SYSTEM "file:///etc/passwd">) o referencia a recursos remotos. - Objetivos típicos: lectura de ficheros locales, SSRF (Server-Side Request Forgery), o exfiltración de datos sensibles.
- Abusa de entidades externas (por ejemplo,
En la práctica, ambos vectores comparten la raíz, manejo inseguro de DTDs y entidades por parte del parser XML, por lo que las mitigaciones suelen solaparse (deshabilitar DTD/entidades, usar parsers seguros, etc). Aclararlo ayuda a priorizar mitigaciones según el riesgo DoS (Billion Laughs) vs confidencialidad/SSRF (XXE clásico).
2. Impacto de la vulnerabilidad
El Billion Laughs Attack no busca robar información, sino inutilizar el sistema. Los efectos principales incluyen:
- Consumo desmedido de memoria (RAM):
Cada expansión de entidad genera una cadena inmensa, hasta que el parser no puede seguir almacenándola. - Sobrecarga de CPU:
El parser debe procesar recursivamente cada nivel, multiplicando las operaciones necesarias. - Bloqueo o caída del servicio:
La aplicación puede dejar de responder o cerrarse inesperadamente. - Impacto potencial en el sistema operativo:
En entornos mal aislados, el agotamiento de memoria puede incluso congelar el sistema host.
Este tipo de ataque es especialmente grave en servicios que procesan XML de usuarios externos, como APIs SOAP, microservicios legacy o sistemas de mensajería.
3. Historia y evolución
- Década de 1990: Las DTD se incorporan al estándar XML, incluyendo las entidades internas para facilitar la reutilización de texto.
- 2002–2003: Investigadores documentan los primeros ataques de entity expansion en parsers XML vulnerables.
- 2013: OWASP incluye el Billion Laughs como una variante crítica del ataque XXE (XML External Entity).
- Actualidad: La mayoría de librerías modernas de XML (como
lxml,defusedxml,javax.xml.parsers) desactivan las expansiones por defecto, pero siguen existiendo parsers vulnerables en sistemas antiguos o configuraciones inseguras.
4. Factores que lo hacen posible
El ataque solo es viable si concurren varios factores:
- Entrada XML sin validación previa.
- Parser mal configurado, sin límites de profundidad o tamaño.
- Expansión de entidades habilitada (internas o externas).
- Ausencia de aislamiento entre procesos (por ejemplo, todo el XML se procesa en el mismo hilo o proceso principal).
5. Detección
Métodos manuales
- Enviar una carga XML maliciosa (como el ejemplo anterior) y observar:
- Retraso prolongado en la respuesta.
- Caída del servicio.
- Logs con errores tipo “OutOfMemoryException” o “Parser limit exceeded”.
Métodos automatizados
- BurpSuite (con plugin de XXE/DoS).
- OWASP ZAP.
- Herramientas de fuzzing XML personalizadas.
Indicadores comunes:
- Respuestas lentas o incompletas.
- Elevado consumo de CPU/RAM en el servidor.
- Reinicios o errores de parsing.
6. Mitigación
Desactivar la expansión de entidades en el parser.
Ejemplos:
- Java:
factory.setExpandEntityReferences(false);from lxml import etree parser = etree.XMLParser(resolve_entities=False)libxml_disable_entity_loader(true);Restringir el tamaño del documento XML y la profundidad máxima de anidamiento.
Usar librerías seguras, como defusedxml o saxutils, que bloquean DTDs por defecto.
Validar y sanitizar la entrada XML antes de procesarla.
Implementar timeouts y límites de recursos por proceso para prevenir DoS a nivel de aplicación.
7. Clasificación
Tipo: Denegación de servicio (DoS por entity expansion).
OWASP Top 10: Relacionado con A4:2017 – XXE.
CWE:
- CWE-776 – Improper Restriction of Recursive Entity References in DTDs.
Billion Laughs Attack es un recordatorio de cómo una característica legítima, como las entidades XML, pueden transformarse en un arma devastadora si no se controla adecuadamente.
Aunque muchos entornos modernos ya desactivan estas funciones, los sistemas legacy y parsers personalizados continúan siendo vulnerables.
Aplicar límites, usar librerías seguras y deshabilitar las DTDs son prácticas esenciales para proteger las aplicaciones XML de este tipo de ataques.