Inyecciones de entidades externas XML (XXE)

Categoría de OWASP: MASVS-CODE: Calidad de código

Descripción general

Una inyección de entidad eXternal de XML (XXE) es un ataque contra aplicaciones que analizan entradas XML. Un ataque XXE se produce cuando un analizador XML configurado de forma débil procesa una entrada XML no confiable con una referencia a una entidad externa. Este ataque se puede usar para almacenar en etapa intermedia varios incidentes, como la denegación del servicio, el acceso al sistema de archivos o el robo de datos.

Impacto

Cuando una aplicación analiza un documento XML, puede procesar cualquier DTD (definición de tipo de documento, también conocida como entidad externa) que se incluya en el documento. Un atacante puede aprovechar este comportamiento inyectando código malicioso como DTD. Este código puede acceder a partes del sistema de archivos del dispositivo, a las que solo la aplicación puede acceder y que posiblemente contengan datos sensibles. Además, este código malicioso puede realizar solicitudes desde el dispositivo, lo que podría evitar las medidas de seguridad del perímetro.

Por último, si la aplicación expande los DTD, esto puede crear una situación con varias iteraciones de entidades a las que se hace referencia, lo que agota los recursos del dispositivo y genera un ataque de denegación del servicio.

Mitigaciones

Inhabilita los DTD

La forma más segura de evitar XXE es inhabilitar siempre los DTD (entidades externas) completo. Según el analizador en uso, el método podría ser similar al siguiente ejemplo para la biblioteca del analizador de extracción de XML:

Java

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

Kotlin

val factory = XmlPullParserFactory.newInstance()
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)

Inhabilitar los DTD también protege el analizador contra ataques de denegación del servicio. Si no es posible inhabilitar los DTD por completo, las entidades externas y las declaraciones de tipo de documento externo deben inhabilitarse de una manera específica para cada analizador.

Debido a la gran cantidad de motores de análisis de XML en el mercado, las formas de evitar los ataques XXE difieren de un motor a otro. Es posible que debas consultar la documentación del motor para obtener más información.

Cómo realizar la limpieza de entradas

Se debe reconfigurar la aplicación para que no permita que los usuarios inserten código arbitrario en el preámbulo del documento XML. Esto se debe verificar del lado del servidor, ya que se pueden omitir los controles del cliente.

Usa una biblioteca diferente

Si la biblioteca o el método que se usa no se pueden configurar de forma segura, se debe considerar una opción diferente. El analizador de extracción de XML y el analizador SAX se pueden configurar de forma segura, lo que inhabilita los DTD y las entidades.

Recursos