FlawOpen

flawopen.com/XXE/Seguridad del parser XML de Java

XXE en Java: ¿DocumentBuilderFactory es segura por defecto?

CWE-611: Improper Restriction of XML External Entity ReferenceGuía de referencia Java XML
Respuesta breve: el acceso externo no se bloquea por defecto

El JDK activa algunos límites de procesamiento seguro por defecto, pero la configuración DOM y SAX predeterminada no bloquea el acceso a recursos externos. Por tanto, un XML puede provocar accesos a archivos o a la red si la aplicación no los restringe expresamente. El comportamiento también puede variar si un proveedor JAXP de terceros sustituye el parser integrado. Configura el parser que realmente utilizas; no deduzcas que es seguro solo por la versión de Java.

INSEGURO
DocumentBuilderFactory factory =
    DocumentBuilderFactory.newInstance();
DocumentBuilder builder =
    factory.newDocumentBuilder();
Document document = builder.parse(untrustedXml);

// Java 9+: activa expresamente las restricciones de JAXP.
// Si falta un ajuste necesario, falla de forma segura.
// El parser puede permitir acceso externo por defecto.
REFORZADO
DocumentBuilderFactory factory =
    DocumentBuilderFactory.newDefaultInstance();

// No pruebes con archivos o servicios reales.
factory.setFeature(
    XMLConstants.FEATURE_SECURE_PROCESSING, true);
factory.setFeature(
    "http://apache.org/xml/features/"
    + "disallow-doctype-decl", true);
factory.setAttribute(
    XMLConstants.ACCESS_EXTERNAL_DTD, "");
factory.setXIncludeAware(false);

// Los límites de tamaño se aplican por separado.
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(untrustedXml);

Por qué rechazar DOCTYPE es el control DOM preferido

Cuando el parser lo admite, rechazar DOCTYPE impide procesar entidades externas y declaraciones definidas en DTD. Activa FEATURE_SECURE_PROCESSING de forma explícita y restringe el acceso a DTD externos como defensa en profundidad; que FSP venga activado por defecto en el JDK no significa que se denieguen las conexiones externas. Mantén XInclude desactivado salvo que sea necesario. Si el proveedor no admite un ajuste requerido, falla al inicializar el parser en vez de continuar con protección parcial.

Si la aplicación debe aceptar DTD, no habilites el acceso externo. Desactiva entidades externas generales y de parámetro, la carga de DTD externos y XInclude; establece ACCESS_EXTERNAL_DTD como cadena vacía y conserva los límites de procesamiento. setExpandEntityReferences(false) cambia la representación del árbol; no sustituye el bloqueo de recursos externos.

Protege cada procesador JAXP por separado

La misma política se aplica al procesamiento XML, pero los controles varían por API. Revisa SAXParserFactory/XMLReader, StAX XMLInputFactory, TransformerFactory, SchemaFactory, Validator y JAXB. StAX no admite FEATURE_SECURE_PROCESSING; desactiva DTD y entidades externas con sus propiedades propias. Restringe también esquemas y hojas de estilo externos. Usa ejemplos específicos de OWASP y confirma el proveedor activo.

No trates la configuración de un parser como protección global de la JVM. El proveedor que selecciona JAXP puede diferir del parser integrado, y un procesador compuesto puede crear parsers internos. Prueba el runtime, proveedor y ruta de código exactos de producción.

Preguntas frecuentes

¿FEATURE_SECURE_PROCESSING bloquea entidades externas por defecto?

No cuando solo está activado por defecto. Oracle documenta que FSP aplica límites de procesamiento, pero las conexiones externas siguen permitidas hasta que se activa explícitamente mediante la API o se configuran propiedades de acceso externo. Define la política expresamente y verifica el proveedor.

¿Los JDK más recientes cambiaron los valores predeterminados?

Las versiones del JDK han añadido restricciones y límites, pero la guía JAXP de Oracle distingue el FSP predeterminado de la denegación explícita de acceso externo. Los proveedores de terceros también pueden diferir. Define los controles explícitamente en vez de confiar en la versión o el classpath.

¿Y si los documentos legítimos necesitan DTD?

Prefiere un catálogo o resolver local confiable. Si necesitas DTD, bloquea protocolos externos y carga de entidades externas, conserva los límites JAXP y desactiva XInclude salvo que sea necesario. Esta política es más compleja que rechazar DOCTYPE; pruébala con el proveedor exacto y documentos válidos.

Fuentes y referencias

Véase también Inyección de entidades externas XML (XXE, CWE-611): cómo funciona y cómo evitarla — flawopen.com Seguridad XXE en XML Python: ElementTree, Expat y lxml ¿XmlReader de .NET es seguro frente a XXE?