XXE: Entity injection aanvallen

Met entity injection aanvallen kunnen applicaties aangevallen worden en datalekken veroorzaken. Dit gebeurd wanneer de XML parser onjuist geconfigureerd is. De meest gevaarlijke variant is XXE, wat staat voor XML eXternal Entity injection. Hierbij kunnen externe resources opgehaald worden, zoals willekeurige bestanden van de server of van andere locaties binnen het netwerk.

Wat is XML

XML (eXtendable Markup Language) is een taal die gebruikt wordt om data gestructureerd op te slaan. Het formaat hiervan is vooraf afgesproken, en is daardoor voor mens en machine te begrijpen. XML wordt op verschillende manieren toegepast, bijvoorbeeld om een browser te vertellen hoe deze pagina is opgebouwd. Een voorbeeld van een XML bestand ziet er als volgt uit:

John Doe
1
Groningen University

Het schoolsysteem kan een mogelijkheid bieden om nieuwe studenten te uploaden middels een XML-bestand. Gebruikers ervan kunnen het bovenstaande voorbeeld opslaan als een studenten.xml bestand. Na het uploaden kan het schoolsysteem het XML-bestand uitlezen en bevragen als een database. Dit zorgt ervoor dat XML zeer geschikt is om gestructureerde data uit te wisselen.

Wat zijn entities

Het XML-formaat ondersteund ook variabelen. Binnen XML wordt zo’n variabele een “entity” genoemd. Stel alle studenten komen van dezelfde school en om te voorkomen dat er 1.000 keer “Cyber University” getypt moet worden, kan het volgende gedaan worden:

John Doe
1
&school;

Bovenaan wordt nu de entity “school” aangemaakt, en deze wordt in het document gebruikt.

External entities

Het kan nog handiger: als de tekst “Cyber University” in een los bestand wordt aangeleverd, zodat het XML-bestand niet meer aangepast hoeft te worden, dan kan de naam ook extern ingeladen worden. Dit kan bijvoorbeeld vanaf een webadres of een lokaal ander bestand. Dit wordt “external entities” genoemd, ook wel bekend als XXE.

]>

John Doe
1
&school;

In het bovenstaande voorbeeld wordt de inhoud van het bestand “school.txt” uitgelezen en gebruikt. Dit is uiteraard handig, maar kan ook een beveiligingsprobleem opleveren. Als het XML-bestand namelijk ingeladen wordt op een server, dan kan er op deze manier bestanden uitgelezen worden die op de server staan. Stel, er staat in dezelfde map een bestand genaamd “passwords.config”, dan is het op deze manier mogelijk de wachtwoorden van de server af te halen, of bijvoorbeeld configuratiebestanden zoals het /etc/passwd bestand. Dit zou een enorm datalek kunnen veroorzaken!

Entity expansions

Een ander probleem wat op kan treden is “entity expansion”. Hiermee is het niet zo zeer mogelijk data stelen, maar wel de server onbereikbaar te maken. Een bekend voorbeeld hiervan is de “billion laughs attack”. Deze staat hieronder:












]>
&lol9;
Wat hier gebeurd is dat er een entity gemaakt wordt met de waarde “lol”. Vervolgens wordt er een nieuwe waarde gemaakt, met 10x de waarde van de entity. Het resultaat is nu dus “lollollollollollol lollollollol”. Dit proces wordt herhaald, totdat de entity lol9 een miljard keer het woord lol bevat. Aangezien een letter 1 byte in het geheugen neemt, neemt de laatste entity 3 miljard bytes in beslag, wat 3GB is. Dit is een enorme aanslag op de resources van de server, aangezien het resultaat niet alleen in het geheugen gezet moet worden, maar ook samengesteld moet worden. De meeste servers zullen hierdoor vastlopen, en mocht de server het overleven dan is de aanval eenvoudig op te schalen door een paar regels extra toe te voegen.

Voorkomen

Er is niet een standaard manier om entity injection en de billion laughs aanval te voorkomen. De meeste XML-parsers kennen wel een instelling die deze mogelijkheid uit kan schakelen. Raadpleeg daarom de handleiding.

Entity injection komt vaak voor in grotere softwarepakketten en maatwerksoftware. Tijdens een pentest controleert CyberAnt hierop.