Error de configuración de seguridad - XXE detallado
La clase de vulnerabilidad "XML eXternal Entities" (XXE) es un error de configuración de seguridad que afecta a los analizadores XML.
El estándar XML incluye formas de referenciar "entidades", como archivos y URL. Por defecto, los analizadores suelen resolver completamente las entidades externas, lo que significa que los documentos XML pueden dar lugar a la revelación de archivos y otra información sensible a posibles atacantes.
Un ejemplo sencillo
Veamos un poco un ejemplo de documento XML que hace uso de entidades externas:
xml
<?xml version="1.0" ?>
<!DOCTYPE outerElement [
<!ENTITY externalEntity SYSTEM "file:///etc/passwd" > ]>
<outerElement>&externalEntity;</outerElement>
En primer lugar, declaramos un nuevo "doctype" que define los tipos de estructura/elemento que pueden existir en el documento y ser manejados por el analizador sintáctico.
Dentro de ella, especificamos una entidad de tipo SYSTEM llamada 'externalEntity'. Esta entidad apunta al fichero '/etc/passwd'.
Tras la definición del doctype, tenemos nuestros datos XML. Definimos un 'outerElement' y luego añadimos una referencia (denotada por el '&') a la entidad 'externalEntity'.
En este punto, el intérprete buscará la definición de la entidad y resolverá la URL definida y puesta en lugar de '&externalEntity;'.
Al final del proceso de análisis sintáctico, obtenemos un documento con el siguiente aspecto:
xml
<?xml version="1.0" ?>
<outerElement>
root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
....
</outerElement>
Mitigación
La necesidad y los detalles de cómo protegerse completamente contra XXE dependen en gran medida del lenguaje, el framework y la versión del mismo.
Cada combinación permitirá a menudo desactivar algunos aspectos del analizador sintáctico que pueden impedir la resolución de archivos, pero no de rutas HTTP. O puede seguir permitiendo la expansión de entidades, lo que por sí mismo puede llevar a una vulnerabilidad de Denegación de Servicio.
.NET
Si está ejecutando .NET 4.5.1 o inferior, las siguientes clases son vulnerables por defecto:
- XmlDocument (Desactivar con 'xmlDocument.XmlResolver = null;')
- XmlTextReader (Desactivar con 'xmlTextReader.ProhibitDtd = true;')
- Navegador XPathNavigator