FlawOpen

flawopen.com/XXE/Java-XML-Parser-Sicherheit

Java-XXE: Ist DocumentBuilderFactory standardmäßig sicher?

CWE-611: Improper Restriction of XML External Entity ReferenceJava-XML-Referenz
Kurzantwort: Externer Zugriff ist nicht standardmäßig blockiert

Das JDK aktiviert standardmäßig einige sichere Verarbeitungslimits, aber die voreingestellte DOM- und SAX-Konfiguration blockiert keinen Zugriff auf externe Ressourcen. XML kann daher Datei- oder Netzwerkzugriffe auslösen, wenn die Anwendung sie nicht ausdrücklich einschränkt. Ein Drittanbieter-JAXP-Provider kann das Verhalten ebenfalls ändern. Konfigurieren Sie den tatsächlich verwendeten Parser; leiten Sie Sicherheit nicht allein aus der Java-Version ab.

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

// Java 9+: JAXP-Einschränkungen ausdrücklich aktivieren.
// Bei fehlender Pflichtfunktion sicher abbrechen.
// Der Parser kann externen Zugriff standardmäßig erlauben.
GEHÄRTET
DocumentBuilderFactory factory =
    DocumentBuilderFactory.newDefaultInstance();

// Nicht mit echten Dateien oder Diensten testen.
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);

// Größenlimits werden separat angewendet.
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(untrustedXml);

Warum DOCTYPE abzulehnen die bevorzugte DOM-Kontrolle ist

Wenn unterstützt, verhindert die Ablehnung von DOCTYPE, dass externe DTD-Entitäten und Entitätsdeklarationen verarbeitet werden. Aktivieren Sie FEATURE_SECURE_PROCESSING ausdrücklich und beschränken Sie zusätzlich den Zugriff auf externe DTDs; standardmäßig aktiviertes FSP bedeutet nicht, dass externe Verbindungen verweigert werden. Lassen Sie XInclude deaktiviert, sofern es nicht erforderlich ist. Lehnt der Provider eine benötigte Einstellung ab, muss die Parserinitialisierung fehlschlagen statt mit unvollständigem Schutz fortzufahren.

Muss die Anwendung DTDs akzeptieren, erlauben Sie keinen externen Zugriff. Deaktivieren Sie externe allgemeine und Parameter-Entitäten, das Laden externer DTDs und XInclude; setzen Sie ACCESS_EXTERNAL_DTD auf eine leere Zeichenfolge und behalten Sie Verarbeitungslimits bei. setExpandEntityReferences(false) ändert die Baumdarstellung und ersetzt nicht die Sperre externer Ressourcen.

Jeden JAXP-Prozessor separat absichern

Die Richtlinie gilt für die XML-Verarbeitung insgesamt, aber die Einstellungen unterscheiden sich je API. Prüfen Sie SAXParserFactory/XMLReader, StAX XMLInputFactory, TransformerFactory, SchemaFactory, Validator und JAXB. StAX unterstützt FEATURE_SECURE_PROCESSING nicht; deaktivieren Sie DTDs und externe Entitäten mit den eigenen Eigenschaften. Beschränken Sie außerdem externe Schemas und Stylesheets. Verwenden Sie die API-spezifischen OWASP-Beispiele und prüfen Sie den aktiven Provider.

Parser-Einstellungen sind kein globaler JVM-Schutz. Der über JAXP ausgewählte Provider kann sich vom integrierten JDK-Parser unterscheiden; zusammengesetzte Prozessoren können interne Parser erzeugen. Testen Sie genau das in Produktion verwendete Runtime, den Provider und den Codepfad.

Häufige Fragen

Blockiert FEATURE_SECURE_PROCESSING externe Entitäten standardmäßig?

Nicht, wenn es nur standardmäßig aktiviert ist. Oracle zufolge setzt das standardmäßige FSP Verarbeitungslimits, externe Verbindungen bleiben aber erlaubt, bis FSP über die API ausdrücklich aktiviert oder externe Zugriffseigenschaften gesetzt werden. Definieren Sie die Richtlinie explizit und prüfen Sie den Provider.

Haben neuere JDKs die Voreinstellungen geändert?

JDK-Versionen haben Einschränkungen und Limits ergänzt, doch Oracles JAXP-Leitfaden unterscheidet weiterhin zwischen standardmäßigem FSP und expliziter Sperre externer Zugriffe. Drittanbieter-Provider können abweichen. Setzen Sie die erforderlichen Kontrollen ausdrücklich.

Was, wenn gültige Dokumente eine DTD benötigen?

Bevorzugen Sie einen vertrauenswürdigen lokalen Katalog oder Resolver. Wenn DTDs nötig sind, blockieren Sie externe Protokolle und das Laden externer Entitäten, behalten Sie JAXP-Limits bei und deaktivieren Sie XInclude, sofern nicht erforderlich. Testen Sie die komplexere Richtlinie mit dem genauen Provider und den benötigten Dokumenten.

Quellen und Referenzen

Siehe auch XML External Entity Injection (XXE, CWE-611): Funktionsweise und Schutz — flawopen.com Python XML-XXE-Sicherheit: ElementTree, Expat und lxml Ist .NET XmlReader gegen XXE geschützt?