Una vulnerabilità XML eXternal Entity (frequentemente abbreviata in XXE) è una minaccia informatica che può verificarsi quando un’applicazione o un servizio web analizza i dati XML in ingresso in modo non sicuro. Con tale vulnerabilità un criminale cerca di sfruttare la capacità di un’applicazione di elaborare entità esterne nel documento XML al fine di ottenere informazioni riservate o comportamenti indesiderati nell’applicativo.
Gli impatti di una vulnerabilità di questo tipo possono portare a conseguenze critiche in base alla gravità della vulnerabilità e la combinazione di questa con altre tecniche.
Tra i principali impatti abbiamo:
- Divulgazione di dati sensibili: tramite tale vulnerabilità è infatti possibile tentare di accedere e recuperare dati sensibili dall’applicazione o dal sistema sottostante. Tra queste informazioni possono esservi credenziali, informazioni personali, informazioni riservate, etc.
- Rilevamento della tipologia di rete: è possibile utilizzare tale vulnerabilità per tentare di identificare la struttura della rete interna dell’organizzazione o delle risorse rete accessibili dal sistema. Tale informazione può essere utilizzata per futuri attacchi mirati.
- Attacchi Denial of Service (DoS): tramite un consumo eccessivo delle risorse del server è possibile generare un disservizio dell’applicativo compromettendo le prestazioni e la disponibilità dell’applicazione.
- Esecuzione di comandi arbitrari: In situazioni più gravi, se l’applicazione è configurata in modo inadeguato, un attaccante può eseguire comandi arbitrati sul server fino ad ottenerne un controllo completo. Ciò porterebbe ad un Remote Code Execution (RCE) tramite XXE.
- Attacchi a catena: è possibile combinare tale vulnerabilità con altre vulnerabilità o tecniche al fine di aumentarne l’impatto. Alcuni esempi possono essere:
- utilizzare una XXE per ottenere l’accesso alle credenziali presenti nel sistema (utilizzando tale vulnerabilità in modo similare ad un attacco Local File Inclusion) ed utilizzarle per ottenere l’accesso.
- effettuare tramite XXE un attacco Server-Side Request Forgery (SSRF) per comunicare con i servizi esposti internamente (come, ad esempio, database SQL).
Esistono diverse tipologie di attacchi XXE che gli attaccanti possono utilizzare per sfruttare tale vulnerabilità:
- Classic XXE: Tale tipologia di attacco permette di ottenere la visualizzazione di contenuti esterni al documento XML come file locali o risorse remote (similmente a LFI e RFI).
- Blind XXE: In questo caso non vi è una risposta diretta dall’applicazione ma può essere utilizzata eseguendo una specie di “sondaggio” delle entità esterne presenti.
- XXE Injection: l’attaccante sfrutta la vulnerabilità per inserire entità malevole nel file XML inviato all’applicazione (può portare ad un RCE).
- Out-of-Band XXE (o OOB XXE): è possibile sfruttare tale attacco per esfiltrare dati verso un server controllato dall’attaccante.
- XXE DTD External Subset: è possibile definire un Document Type Definition (DTD) malevolo per definire entità esterne che verranno elaborate durante l’analisi del documento.
- Name-Based XXE: In questo tipo di attacco, l’attaccante sfrutta le entità esterne basate su nomi per ottenere informazioni o eseguire azioni dannose.
- Ad esempio, l’attaccante può fare riferimento a un nome di entità esterna che corrisponde a una risorsa sensibile.
- Code-Based XXE: Questa tipologia consiste nell’inserire del codice XML malevolo nell’input, che verrà quindi elaborato come parte del documento XML (può portare ad un RCE).
- XXE combinata: Gli attaccanti possono sfruttare una XXE con altre tipologie di vulnerabilità come ad esempio SQLi o SSRF per compiere attacchi più sofisticati.
Partendo dalla struttura base di un file XML
<info>
<text>test</text>
</info>
è possibile verificare l’uso di entità esterne con il seguente codice:
<!DOCTYPE replace [
<!ENTITY example "XXE">
]>
<info>
<text>&example;</text>
</info>
Se le entità esterne sono abilitate è quindi possibile verificare se è possibile andare a leggere i file interni del sistema come nei seguenti codici:
<!DOCTYPE replace [
<!ENTITY example SYSTEM "file:///etc/passwd">
]>
<info>
<text>&example;</text>
</info>
In questo caso si potrebbe anche esfiltrare i dati codificandoli in base64 al fine di evitare errori durante il trasferimento. Con il seguente codice XML si tenta di recuperare il codice sorgente di index.php al fine di identificare vulnerabilità nel codice stesso.
<!DOCTYPE foo [
<!ENTITY example SYSTEM
"php://filter/convert.base64-encode/resource=index.php" >
]>
<info>
<text>`&example;`</text>
</info>
Un altro scenario possibile è un attacco di tipo SSRF (in questo scenario per comodità abbiamo preso il server remoto e quello dell’attaccante sullo stesso indirizzo IPv4). Tramite tale attacco è possibile generare una richiesta ad un indirizzo ip che può essere interno alla rete come, ad esempio, rete locale (10.0.0.0/8, 192.168.0.0/16) oppure interni come 127.0.0.1.
<!DOCTYPE foo [
<!ENTITY example SYSTEM "http://192.168.71.110:8000/">
]>
<info>
<text>&example;</text>
</info>
Infine, un caso più estremo dovuto alla presenza del modulo expect (che deve essere installato manualmente su php tramite pecl) è possibile ottenere un RCE andando semplicemente a modificare il comando id con il comando scelto.
<!DOCTYPE foo [
<!ENTITY example SYSTEM "expect://id" >]>
<info>
<text>`&example;`</text>
</info>
Al fine di mitigare questa tipologia di vulnerabilità è importante seguire le best practice di sicurezza proposte:
- È possibile prevenire tale vulnerabilità impedendo l’elaborazione delle entità esterne disabilitandole configurando il parser XML in modo da non consentire l’uso di queste ultime.
- La validazione dell’input può aiutare a mitigare tale vulnerabilità al fine di garantire che solo i documenti XML ben formati e autorizzati siano accettati. Tale validazione può essere effettuata tramite Document Type Definition o XML Schema.
- Assicurarsi di utilizzare parse XML aggiornati e ben mantenuti che abbiano funzionalità di sicurezza integrate per prevenire tali tipologie di attacco.
- Se è necessario consentire l’utilizzo di entità esterne è importante applicare un filtro per garantire che solo le entità attendibili vengano utilizzate. Per tale filtraggio è preferibile l’utilizzo di una whitelist contente la lista di entità consentite.
- Utilizzare meccanismi basati sui permessi in modo da limitare l’accesso alle risorse esterne sulla base dei privilegi/autorizzazioni dell’utente o dell’applicazione.
- L’implementazione di un sistema di monitoraggio può aiutare ad identificare ed intervenire nel caso di attacchi in corso o comportamenti anomali.
Inoltre, è consigliabile:
- effettuare una formazione del personale coinvolto nello sviluppo e manutenzione delle applicazioni per sensibilizzarlo a tale tipologia di minaccia.
- effettuare test di sicurezza, inclusi penetration test al fine di identificare e risolvere eventuali vulnerabilità XXE presenti nell’applicazione.