IT-Sicherheit Glossar

Was ist eine XXE-Schwachstelle?

Eine XML-External-Entity-Schwachstelle, kurz XXE, entsteht, wenn ein XML-Parser eine Dokumenttypdefinition verarbeitet und externe Entitäten aus nicht vertrauenswürdigem XML auflöst. Ein Angreifer referenziert eine lokale Datei oder URL und lässt den Server deren Inhalt während des Parsens einfügen.

Mögliche Folgen sind das Lesen von Dateien, SSRF, Zugriffe auf interne Netze und Denial of Service. Bei Blind XXE werden Daten nicht direkt angezeigt, können aber über DNS oder eine ausgehende HTTP-Anfrage übertragen werden. Moderne Parser sind standardmäßig oft sicherer; das Verhalten unterscheidet sich dennoch nach Bibliothek und Version.

Wie lässt sich XXE verhindern?

  • - DTD-Verarbeitung und das Auflösen externer Entitäten für nicht vertrauenswürdiges XML deaktivieren.
  • - Einen gepflegten Parser mit sicheren Voreinstellungen einsetzen und ihn ausdrücklich konfigurieren.
  • - Einfachere Formate wie JSON bevorzugen, wenn XML-Funktionen nicht benötigt werden.
  • - Dateizugriff und ausgehende Netzwerkverbindungen des verarbeitenden Dienstes begrenzen.

Codebeispiele: verwundbare und sichere XML-Parser

Die konkrete Absicherung hängt vom verwendeten Parser ab. Entscheidend ist, DTDs beziehungsweise externe Ressourcen ausdrücklich zu sperren und nicht nur auf aktuelle Standardwerte zu hoffen.

PHP mit DOMDocument

// Verwundbar: DTD laden und Entitäten ersetzen
$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_DTDLOAD | LIBXML_NOENT);

// Sicher für nicht vertrauenswürdiges XML
if (stripos($xml, '<!DOCTYPE') !== false) {
    throw new InvalidArgumentException('DTD ist nicht erlaubt');
}

$options = LIBXML_NONET;
if (defined('LIBXML_NO_XXE')) { // PHP 8.4 mit neuerem libxml
    $options |= LIBXML_NO_XXE;
}
$dom->loadXML($xml, $options);

LIBXML_NOENT und LIBXML_DTDLOAD dürfen bei fremdem XML nicht aktiviert werden. LIBXML_NONET sperrt Netzwerkzugriffe; LIBXML_NO_XXE steht erst in neueren Kombinationen aus PHP und libxml zur Verfügung.

Java mit DocumentBuilderFactory

// Verwundbar: Parser ohne explizite Grenzen
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
Document document = factory.newDocumentBuilder().parse(input);

// Sicher: DTDs und externe Ressourcen ablehnen
factory.setFeature(
    "http://apache.org/xml/features/disallow-doctype-decl", true);
factory.setFeature(
    "http://xml.org/sax/features/external-general-entities", false);
factory.setFeature(
    "http://xml.org/sax/features/external-parameter-entities", false);
factory.setXIncludeAware(false);
factory.setExpandEntityReferences(false);
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
Document document = factory.newDocumentBuilder().parse(input);

Die Factory muss vor dem Erzeugen des Builders konfiguriert werden. Wirft eine konkrete Parserimplementierung bei einem Sicherheitsmerkmal eine Exception, darf die Anwendung nicht still auf eine unsichere Konfiguration zurückfallen.

.NET mit XmlReader

// Verwundbar: DTD-Verarbeitung und Resolver aktiviert
var unsafeSettings = new XmlReaderSettings {
    DtdProcessing = DtdProcessing.Parse,
    XmlResolver = new XmlUrlResolver()
};

// Sicher: DTD verbieten, Resolver entfernen und Größe begrenzen
var settings = new XmlReaderSettings {
    DtdProcessing = DtdProcessing.Prohibit,
    XmlResolver = null,
    MaxCharactersInDocument = 1_000_000
};
using var reader = XmlReader.Create(stream, settings);
var document = XDocument.Load(reader);

Python mit lxml

# Verwundbar: DTD laden und Entitäten auflösen
unsafe_parser = etree.XMLParser(
    load_dtd=True,
    resolve_entities=True
)
root = etree.fromstring(xml_bytes, unsafe_parser)

# Sicher: keine Entitäten, keine DTD und kein Netzwerk
safe_parser = etree.XMLParser(
    load_dtd=False,
    resolve_entities=False,
    no_network=True
)
root = etree.fromstring(xml_bytes, safe_parser)

Wenn die Anwendung keine DTD-Funktionen benötigt, ist vollständiges Ablehnen die robusteste Variante. Muss sie DTDs verarbeiten, gehören ein eigener vertrauenswürdiger Katalog, ein enger Resolver und Prozessisolation in das Design.

Wo kann XXE noch auftreten?

Neben offensichtlichen XML-APIs steckt XML in Office-Dokumenten, SVG-Bildern, SAML-Nachrichten und SOAP-Anfragen. Dateikonvertierung und Importfunktionen verdienen daher dieselbe Prüfung wie direkte XML-Endpunkte.

Was sind externe Entitäten und DTDs?

Eine Document Type Definition kann Entitäten definieren, die der Parser beim Lesen ersetzt. Externe Entitäten verweisen auf eine Datei oder URL. Diese Funktion war für wiederverwendbare Inhalte gedacht, verbindet bei nicht vertrauenswürdigen Dokumenten aber Eingabedaten mit lokalen und entfernten Ressourcen des Servers. Parameter-Entitäten und externe DTDs ermöglichen zudem komplexere Verarbeitung, selbst wenn die Anwendung die unmittelbare Parserausgabe nicht anzeigt.

Welche Auswirkungen sind möglich?

  • Dateizugriff:
    lesbare Konfigurationsdateien oder Systeminformationen werden in die XML-Ausgabe eingebunden.
  • SSRF:
    der Parser ruft interne Dienste, Cloud-Metadaten oder kontrollierte externe Systeme auf.
  • Blind XXE:
    Daten oder Nachweise verlassen den Server über ausgehende DNS- oder HTTP-Verbindungen.
  • Denial of Service:
    rekursive oder stark expandierende Entitäten verbrauchen Speicher und CPU.

Wie wird XXE getestet?

Zuerst wird ermittelt, welche Uploads und Endpunkte tatsächlich XML parsen. Ein harmloser lokaler Wert oder eine kontrollierte Callback-Domain zeigt, ob DTDs und externe Entitäten aufgelöst werden. Bei dateibasierten Formaten muss die manipulierte XML-Datei wieder korrekt in das Archiv eingebettet werden. Tests gegen interne Adressen oder große Entity-Expansionen sind auf Produktivsystemen zu vermeiden. Parserkonfiguration und Bibliotheksversion liefern im Code-Review den zuverlässigsten Nachweis.

Warum Netzwerkfilter trotzdem wichtig sind

Das Deaktivieren von DTDs und externen Entitäten behebt die Ursache. Minimale Dateirechte und eingeschränkte ausgehende Verbindungen begrenzen zusätzlich, was ein fehlerhaft konfigurierter Parser erreichen kann. Ein isolierter Konvertierungsdienst ist besonders für komplexe Office- oder Grafikformate sinnvoll. XML-Schema-Validierung allein verhindert XXE nicht, weil die gefährliche Auflösung häufig vor der eigentlichen Validierung stattfindet.

Penetrationstests

Sicherheitslücken aufdecken

Professionelle Penetrationstests für Ihr Unternehmen

Web Apps
Netzwerke
Mobile Apps
10% Neukunden-Rabatt
Jetzt planen

Mehr Informationsmaterial

Prüfung und sichere Parser

Out-of-Band-Tests benötigen einen kontrollierten Callback-Dienst und eine ausdrückliche Freigabe.

Vielen Dank für dein Feedback! Wir werden es prüfen und unseren Artikel anpassen.

Hast du Feedback zum Thema XML External Entity (XXE)? Schreib uns!