¿Qué es un ataque XXE y cómo se mitiga?
Respuesta breve
El XXE abusa de un analizador XML que resuelve las entidades externas definidas en la DTD de un documento. Un atacante declara una entidad que apunta a un archivo local o una URL interna, y el analizador la obtiene — permitiendo la divulgación de archivos, el SSRF y la denegación de servicio. La solución es desactivar el procesamiento de DTD y la resolución de entidades externas en la configuración del analizador.
La inyección de entidad externa XML (XXE) explota una característica potente y rara vez necesaria de XML: un documento puede definir entidades en su Document Type Definition (DTD), y esas entidades pueden apuntar a recursos externos. Cuando un analizador mal configurado procesa XML proporcionado por un atacante, resuelve gustosamente esas referencias externas — obteniendo lo que el atacante haya nombrado.
Qué puede hacer un atacante
La carga útil clásica declara una entidad que apunta a un archivo local:
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<foo>&xxe;</foo>
Cuando el analizador expande &xxe;, el contenido del archivo se incorpora a la respuesta — divulgación arbitraria de archivos. El mismo truco con http:// hace que el servidor obtenga una URL interna, convirtiendo el XXE en SSRF (incluido el punto de metadatos de la nube). Incluso el XXE a ciegas, donde la respuesta no se devuelve, puede exfiltrar datos fuera de banda haciendo que la entidad desencadene una petición saliente a un servidor del atacante. Y la expansión recursiva de entidades (el ataque «billion laughs») puede agotar la memoria para un DoS.
Por qué es tan común
Los analizadores XML de muchos lenguajes habilitaban históricamente el procesamiento de DTD y entidades externas por defecto. Cualquier punto que acepte XML — SOAP, SAML, subidas de SVG, documentos ofimáticos, RSS — es un candidato, a menudo donde los desarrolladores ni siquiera se dan cuenta de que se está analizando XML.
Mitigación
La solución fiable es endurecer el analizador:
- Desactiva por completo el procesamiento de DTD donde sea posible (por ejemplo,
disallow-doctype-decl). - Si se necesitan DTD, desactiva las entidades generales y de parámetro externas.
- Mantén las bibliotecas del analizador actualizadas y prefiere valores por defecto seguros.
- Cuando sea factible, usa un formato menos peligroso como JSON.
La validación de entrada por sí sola no ayuda, porque el peligro está en el análisis, no en los valores de los datos.
Los entrevistadores buscan el mecanismo de entidad externa, el trío de impactos (lectura de archivos, SSRF, DoS), la conciencia del XXE a ciegas, y «desactivar las DTD / entidades externas» como solución en lugar del filtrado de entrada.
Posibles preguntas de seguimiento
- ¿Cómo es el ataque 'billion laughs' una forma de DoS relacionado con XXE?
- ¿Por qué puede explotarse el XXE incluso cuando no se devuelve el cuerpo de la respuesta?
- ¿Qué formato de datos más seguro sugerirías en lugar de XML?