Entitätsexpansion
Die Entitätsexpansion (auch XML-Bombe)[1] ist eine Art von DoS-Angriff, die auf XML-Parser abzielt.[2]
Beschreibung
Der exemplarische Angriff der Entitätsexpansion besteht daraus, zehn XML-Entitäten zu definieren, die jeweils aus zehn Entitäten der vorherigen Entität bestehen. Das Dokument besteht schließlich aus einer einzelnen Instanz der obersten Entität, welche sich daraufhin zu einer Milliarde Kopien der ersten Entität expandiert.
In dem häufig angeführten unten stehenden Beispiel wird als Entitätenname der String „lol“ gewählt. Daher kommt der englische Begriff
, welcher für „(eine) Milliarde Lacher“ steht. Der Unterschied zwischen
und Milliarde beruht auf der Langen und kurzen Skala, zwei unterschiedlichen Systemen zur Benennung großer Zahlen.
Es wird darauf abgezielt, dass die Menge an benötigtem Arbeitsspeicher jenen verfügbaren Speicher überschreitet, der dem Prozess zur Verfügung steht, welcher das XML parst. Dies war zum Zeitpunkt des Bekanntwerden dieser Verwundbarkeit wahrscheinlicher als in der Gegenwart.
Während die eigentliche Form des Angriffs spezifisch auf XML-Parser abzielte, können die Termini auch auf vergleichbare Szenarien angewendet werden.[2]
Von dem Problem der Entitätsexpansion wurde erstmals bereits 2003 berichtet, es wurde aber erst im Jahr 2008 umfänglich beachtet.[3]
Abwehr
Es gibt verschiedene Abwehrmöglichkeiten für diese Art von Angriff:
- Begrenzung des zugeordneten Speichers für den jeweiligen Parser (wenn der Verlust des Dokuments durch das nicht vollständige Prozessieren akzeptabel ist)
- Problemerkennung durch den Parser wenn Entitäten zu Entitäten aufgelöst werden und Stopp der Auswertung mit Ausnahmebehandlung
- Behandlung von Entitäten als Symbole (ohne Auswertung)
- Lazy Evaluation
Manche Webbrowser unterbrechen die Auswertung von Entitätsexpansionen mit einer Fehlermeldung, zum Beispiel Google Chrome (engl. detected an entity reference loop „Entitätsreferenzschleife erkannt“) oder Mozilla Firefox (XML-Verarbeitungsfehler „Rekursive Entitätsreferenz“).
Code-Beispiel
Wenn ein XML-Parser das folgende Dokument lädt, erkennt dieser ein Wurzelelement (lolz), das den Text „&lol9;“ enthält.
Die Entität &lol9; ist definiert als ein String, der zehn „&lol8;“-Strings enthält. Jeder einzelne dieser „&lol8;“-Strings enthält wiederum zehn „&lol7;“-Strings, und so weiter.
Nachdem alle Entitätsexpansionen prozessiert sind, würde dieser kleine XML-Block (weniger als 1 kB) aus 109 = 1.000.000.000 lol bestehen, welche knapp drei Gigabyte Speicher benötigen.[4]
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!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>
Siehe auch
Einzelnachweise
- ↑ Bryan Sullivan: XML Denial of Service Attacks and Defenses. In: Microsoft Corporation (Hrsg.): MSDN Magazine. November 2009. Abgerufen am 31. Mai 2011.
- ↑ a b Elliotte Rusty Harold: Tip: Configure SAX parsers for secure processing. In: IBM developerWorks. 27. Mai 2005. Archiviert vom Original am 4. März 2011. Abgerufen am 4. März 2011.
- ↑ CVE-2003-1564. In: Common Vulnerabilities and Exposures. The MITRE Corporation, 2. Februar 2003, abgerufen am 1. Juni 2011.
- ↑ Bryan Sullivan: XML Denial of Service Attacks and Defenses. Abgerufen am 21. Dezember 2011.