Directrices

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