Entitätsexpansion
# Entitätsexpansion

Die Entitätsexpansion (auch XML-Bombe) ist eine Art von DoS-Angriff, die auf XML-Parser abzielt.

## 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 billion laughs, welcher für „(eine) Milliarde Lacher“ steht. Der Unterschied zwischen billion 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.
Von dem Problem der Entitätsexpansion wurde erstmals bereits 2003 berichtet, es wurde aber erst im Jahr 2008 umfänglich beachtet.

## 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 10$^9$ = 1.000.000.000 lol bestehen, welche knapp drei Gigabyte Speicher benötigen.