
Prova di concetto dell'iniezione XXE in Ktor (CVE-2023-45612)
Impatto: accesso arbitrario ai file tramite un DTD XML appositamente predisposto con un riferimento XXE.
Causa principale: parser di documenti XML non sicuro.
Questa repository contiene un'applicazione Ktor 2.3.4 vulnerabile, configurata per consentire entità esterne così che l'effetto XXE sia visibile.
Applicazione Ktor vulnerabile (v2.3.4) per la prova di concetto dell'iniezione di entità esterne XML (CVE-2023-45612).
CVE-2023-45612 è un bug XXE (entità esterna XML) in ContentNegotiation di Ktor quando XML è abilitato nelle versioni precedenti alla 2.3.5.
Questa vulnerabilità corrisponde a CWE-611: Restrizione impropria del riferimento a entità esterna XML.
XXE fa parte della categoria di rischio OWASP Top 10 A05:2021-Security Misconfiguration, ma è anche un problema di progettazione non sicura, poiché la causa è un parser XML non restrittivo.
Segnalata da Ulf Karlsson — vedi note sulla sicurezza JetBrains.
Versioni di Ktor precedenti alla 2.3.5
Questo è il mio ambiente per riprodurre il problema:
I documenti XML possono opzionalmente contenere una Document Type Definition (DTD) che, tra le altre funzionalità, consente la definizione di entità XML. È possibile definire un'entità fornendo una stringa di sostituzione sotto forma di URI. Il parser XML può accedere al contenuto di questo URI e incorporarlo nuovamente nel documento XML per ulteriori elaborazioni.
Inviando un file XML che definisce un'entità esterna con un URI file://, un attaccante può indurre l'applicazione in elaborazione a leggere il contenuto di un file locale.
Ad esempio, un URI come "file:///c:/winnt/win.ini" designa (su Windows) il file C:\Winnt\win.ini, oppure file:///etc/passwd designa il file delle password nei sistemi basati su Unix.
(https://cwe.mitre.org/data/definitions/611.html)
Una richiesta POST viene effettuata all'endpoint http://localhost:8080/xml.
La richiesta invia un file xml, exploit/payloads/xxe-demo-file.xml, contenente un elemento <!DOCTYPE> in cui viene referenziata un'entità esterna, in questo caso exploit/etc/secret.txt.
Potenzialmente potrebbe essere qualsiasi altro file sul sistema a cui il processo ha accesso.
xxe-demo-file.xml
<!DOCTYPE Mail [ <!ENTITY xxe SYSTEM "exploit/etc/secret.txt"> ]>
<Mail><title>&xxe;</title></Mail>
Il parser XML (configurato per consentire le DTD) risolve questo elemento e recupera i dati della risorsa.
Il riferimento esterno potrebbe anche essere un percorso verso un endpoint SSRF, oppure puntare a un file di grandi dimensioni per occupare le risorse di sistema (DOS).
./gradlew run
Responding at http://127.0.0.1:8080
curl -i http://localhost:8080/xml -H "Content-Type: application/xml" --data-binary @exploit/payloads/xxe-demo-file.xml
Risultato atteso (vulnerabile):
L'output della console:
Received: <external entity data>
Risultato atteso (sicuro):
400 Bad Request, o simile (il parser XML blocca la Document Type Definition)
Esegui il comando:

Invia il payload XXE usando cURL e il risultato che mostra il contenuto del file iniettato:

La gravità è alta/critica. Potenziale recupero di file locali, attacco SSRF, attacco DoS, o altri impatti sul sistema.
Punteggio base NVD: 9.8 CRITICAL (CVSS v3) (https://nvd.nist.gov/vuln/detail/CVE-2023-45612)
XmlResolver personalizzato con un timeout delle richieste, un limite al recupero dei dati e restrizioni sulle risorse che può recuperare localmente.