FlawOpen

flawopen.com/XXE/Sécurité des parsers XML Java

XXE Java : DocumentBuilderFactory est-elle sûre par défaut ?

CWE-611: Improper Restriction of XML External Entity ReferenceGuide de référence Java XML
Réponse courte : l’accès externe n’est pas bloqué par défaut

Le JDK active par défaut certaines limites de traitement, mais la configuration DOM et SAX ne bloque pas l’accès aux ressources externes. Un XML peut donc déclencher un accès fichier ou réseau si l’application ne le restreint pas explicitement. Le comportement peut aussi varier si un fournisseur JAXP tiers remplace le parser intégré. Configurez le parser réellement utilisé ; ne déduisez pas sa sécurité de la seule version Java.

NON SÉCURISÉ
DocumentBuilderFactory factory =
    DocumentBuilderFactory.newInstance();
DocumentBuilder builder =
    factory.newDocumentBuilder();
Document document = builder.parse(untrustedXml);

// Java 9+ : activez explicitement les restrictions JAXP.
// Si un réglage obligatoire échoue, arrêtez l’initialisation.
// Le parser peut autoriser l’accès externe par défaut.
SÉCURISÉ
DocumentBuilderFactory factory =
    DocumentBuilderFactory.newDefaultInstance();

// Ne testez pas avec de vrais fichiers ou services.
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);

// Les limites de taille sont configurées séparément.
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(untrustedXml);

Pourquoi refuser DOCTYPE est le contrôle DOM à privilégier

Lorsque le parser le permet, refuser DOCTYPE empêche le traitement des entités externes et déclarations définies dans une DTD. Activez explicitement FEATURE_SECURE_PROCESSING et restreignez l’accès aux DTD externes en défense supplémentaire ; le FSP activé par défaut dans le JDK ne signifie pas que les connexions externes sont refusées. Gardez XInclude désactivé sauf nécessité. Si le fournisseur ne prend pas en charge un réglage obligatoire, faites échouer l’initialisation plutôt que de continuer avec une protection partielle.

Si l’application doit accepter des DTD, n’autorisez pas l’accès externe. Désactivez les entités externes générales et paramétrées, le chargement des DTD externes et XInclude ; définissez ACCESS_EXTERNAL_DTD sur une chaîne vide et conservez les limites. setExpandEntityReferences(false) modifie la représentation de l’arbre ; ce n’est pas un substitut au blocage des ressources externes.

Sécurisez séparément chaque processeur JAXP

La même politique s’applique au traitement XML, mais les réglages diffèrent selon l’API. Examinez SAXParserFactory/XMLReader, StAX XMLInputFactory, TransformerFactory, SchemaFactory, Validator et JAXB. StAX ne prend pas en charge FEATURE_SECURE_PROCESSING ; désactivez DTD et entités externes avec ses propres propriétés. Restreignez aussi l’accès aux schémas et feuilles de style. Suivez les exemples OWASP propres à chaque API et vérifiez le fournisseur actif.

Ne considérez pas les réglages d’un parser comme une protection globale de la JVM. Le fournisseur choisi par JAXP peut différer du parser intégré et un processeur composite peut créer des parsers internes. Testez le runtime, le fournisseur et le chemin de code réellement déployés.

FAQ

FEATURE_SECURE_PROCESSING bloque-t-il les entités externes par défaut ?

Pas lorsqu’il est seulement activé par défaut. Oracle précise que le FSP par défaut impose des limites de traitement, mais que les connexions externes restent autorisées jusqu’à son activation explicite via l’API ou à la configuration des propriétés d’accès externe. Définissez la politique et vérifiez le fournisseur.

Les JDK récents ont-ils changé les valeurs par défaut ?

Les versions du JDK ont ajouté restrictions et limites, mais le guide JAXP d’Oracle distingue toujours le FSP par défaut du refus explicite d’accès externe. Les fournisseurs tiers peuvent aussi varier. Configurez les protections plutôt que de dépendre de la version ou du classpath.

Que faire si des documents valides nécessitent une DTD ?

Préférez un catalogue ou résolveur local de confiance. Si les DTD sont nécessaires, bloquez les protocoles externes et le chargement des entités externes, gardez les limites JAXP et désactivez XInclude sauf besoin. Cette politique est plus complexe que le refus de DOCTYPE ; testez-la avec le fournisseur et les documents concernés.

Sources et références

À voir aussi Injection d'entité externe XML (XXE, CWE-611) : fonctionnement et prévention — flawopen.com Sécurité XXE XML en Python : ElementTree, Expat et lxml XmlReader de .NET est-il sûr contre XXE ?