Unsachgemäße Einschränkung rekursiver Entity-Referenzen in DTDs (XML Entity Expansion)
Beschreibung
Unsachgemäße Einschränkung rekursiver Entity-Referenzen in DTDs tritt auf, wenn ein Produkt XML-Dokumente verwendet und erlaubt, dass deren Struktur mit einer Document Type Definition (DTD) definiert wird, aber die Anzahl rekursiver Definitionen von Entities nicht ordnungsgemäß kontrolliert. XML erlaubt die Definition von Entities, die auf andere Entities referenzieren, was das Potenzial für exponentielle Expansion schafft. Der klassische "Billion Laughs"-Angriff definiert verschachtelte Entities, wobei jede Ebene die vorherige mehrfach referenziert, was ein kleines XML-Dokument beim Parsen zu Gigabytes an Daten expandieren lässt.
Risiko
XML Entity Expansion-Angriffe können Server mit minimalem Angriffs-Payload lahmlegen. Einige hundert Bytes bösartiges XML können zu Gigabytes expandieren und den Speicher sofort erschöpfen. CVE-2023-52426 in libexpat (betrifft Versionen bis 2.5.0) zeigte, dass selbst etablierte XML-Bibliotheken verwundbar sein können. Kürzlich betroffene Produkte umfassen IBM Maximo Application Suite, Meinberg LANTIME Firmware, Dell PowerProtect Data Manager und IBM Rational ClearCase. Dieser Angriff ist besonders gefährlich, weil er keine Authentifizierung erfordert und gegen jeden XML-verarbeitenden Endpunkt funktioniert.
Lösung
Deaktivieren Sie DTD-Verarbeitung vollständig, wenn externes XML akzeptiert wird. Setzen Sie Entity-Expansion-Limits in XML-Parsern. In Java verwenden Sie XMLConstants.FEATURE_SECURE_PROCESSING und setProperty für Entity-Limits. In Python verwenden Sie die defusedxml-Bibliothek. In PHP verwenden Sie libxml_disable_entity_loader(). Konfigurieren Sie Parser, um Gesamt-Entity-Expansionen und verschachtelte Entity-Tiefe zu begrenzen. Wenn DTDs erforderlich sind, implementieren Sie strenge Limits für Entity-Expansions-Anzahl und Gesamt-Expansionsgröße.
Häufige Auswirkungen
| Auswirkung | Details |
|---|---|
| Verfügbarkeit | Bereich: Denial of Service Exponentielle Entity-Expansion verbraucht allen Speicher und lässt die Anwendung oder den Server abstürzen. |
| Systemressourcen | Bereich: CPU-Erschöpfung Die Verarbeitung exponentiell expandierender Entities verbraucht CPU-Zyklen. |
| Finanziell | Bereich: Ressourcenkosten In Cloud-Umgebungen kann Speicher- und CPU-Verbrauch erhebliche Kosten auslösen. |
Beispielcode + Lösungscode
Verwundbarer Code
<!-- VERWUNDBAR: Billion Laughs Angriffs-Payload -->
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>
<!-- Diese ~1KB-Datei expandiert zu ~3GB "lol"-Strings -->
// VERWUNDBAR: Standard-XML-Parser erlaubt Entity-Expansion
import javax.xml.parsers.DocumentBuilderFactory;
public class XMLProcessor {
public Document parseXML(String xmlInput) throws Exception {
// Standard-Parser ist anfällig für Billion Laughs!
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
return builder.parse(new InputSource(new StringReader(xmlInput)));
}
}
Gefixter Code
// SICHER: DTDs deaktivieren und Entity-Expansion begrenzen
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.XMLConstants;
public class SecureXMLProcessor {
private static final int MAX_ENTITY_EXPANSIONS = 100;
public Document parseXMLSafe(String xmlInput) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// DTDs vollständig deaktivieren (bester Schutz)
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
// Wenn DTDs erlaubt sein müssen, strenge Limits setzen
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
// Entity-Expansion-Limit setzen
factory.setAttribute("http://www.oracle.com/xml/jaxp/properties/entityExpansionLimit",
MAX_ENTITY_EXPANSIONS);
// Externe Entities deaktivieren
factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
factory.setExpandEntityReferences(false);
DocumentBuilder builder = factory.newDocumentBuilder();
return builder.parse(new InputSource(new StringReader(xmlInput)));
}
}
# SICHER: defusedxml-Bibliothek verwenden
import defusedxml.ElementTree as ET
def parse_xml_safe(xml_string):
# defusedxml blockiert Entity-Expansion-Angriffe standardmäßig
root = ET.fromstring(xml_string)
return root
# SICHER: lxml konfigurieren um Expansion zu verhindern
from lxml import etree
def parse_xml_lxml_safe(xml_string):
parser = etree.XMLParser(
resolve_entities=False, # Entities nicht auflösen
no_network=True, # Kein Netzwerkzugriff
dtd_validation=False, # DTD nicht validieren
load_dtd=False, # Externe DTD nicht laden
huge_tree=False # Baumgröße begrenzen
)
root = etree.fromstring(xml_string.encode(), parser)
return root
Ausgenutzt in der Praxis
libexpat Rekursive Expansion (libexpat, 2024)
CVE-2023-52426 in libexpat bis 2.5.0 erlaubt rekursive XML Entity Expansion wenn XML_DTD undefiniert ist, was zahlreiche Anwendungen betrifft, die diese weit verbreitete Bibliothek für XML-Parsing verwenden.
IBM Maximo Application Suite (IBM, 2025)
XML Entity Expansion-Schwachstelle in IBM Maximo Application Suite Manage Component erlaubt Angreifern Denial of Service durch gestaltete XML-Dokumente.
Tools zum Testen/Ausnutzen
-
XMLBomb - XML Entity Expansion Test-Payloads.
-
Burp Suite - XML-Endpunkte mit XEE-Payloads testen.
-
OWASP ZAP - Automatisiertes XXE/XEE-Testing.
CVE-Beispiele
-
CVE-2023-52426 - libexpat rekursive Entity-Expansion.
-
CVE-2013-1643 - PHP SOAP Extension XML-Bombe.
-
CVE-2003-1564 - Ursprünglicher Billion Laughs-Angriff in XML-Parsern.
Referenzen
-
MITRE. "CWE-776: Improper Restriction of Recursive Entity References in DTDs." https://cwe.mitre.org/data/definitions/776.html
-
OWASP. "XML External Entity (XXE) Processing." https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing