
Prova de conceito executável em Spring Boot que reproduz o CVE-2026-88901, uma falha XXE (CWE-611) no Apache Camel camel-smooks, com execuções de controle afetadas e corrigidas.
Reprodutor de prova de conceito executável para a vulnerabilidade do Apache Camel em que o formato de dados Smooks
(.unmarshal().smooks(...)) e o componente Smooks (smooks:) analisavam o corpo XML recebido com o leitor
que o Smooks resolve por padrão (o parser SAX Woodstox), que resolve entidades gerais e de parâmetro externas e
carrega DTDs externos — e o camel-smooks não aplicava nenhum dos endurecimentos de parser que os outros componentes XML do Camel aplicam.
Um DOCTYPE com um subconjunto externo, ou uma entidade geral externa, declarado no documento XML é, portanto, resolvido
e expandido enquanto o corpo é desmarshalled, e o conteúdo resolvido é vinculado ao resultado. Um remetente externo
cujo XML chegue a um formato de dados ou endpoint camel-smooks poderia ler arquivos legíveis pelo processo Camel, ou fazer o
processo emitir requisições para hosts internos (CWE-611). Nenhuma opção não padrão é necessária — resolver entidades externas era
o comportamento padrão.
Somente Spring Boot. Este reprodutor inclui um único módulo Camel Spring Boot. O
camel-smooksnão tem extensãocamel-quarkus-smooks, portanto não há contraparte Quarkus a reproduzir. O módulo Spring Boot demonstra o comportamento afetado e o corrigido.
| Runtime | Diretório | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-smooks 4.22.0 (afetado; corrigido em 4.22.1) |
O driver espelha o próprio teste de regressão da correção (SmooksDataFormatXmlSecurityTest). Um arquivo marcador benigno é
escrito em um diretório temporário, e um documento XML <customer> é desmarshalled através do SmooksDataFormat real com
o smooks-config.xml padrão (vinculando o documento a um bean Customer). O firstName do documento é uma entidade externa
apontando para o arquivo marcador:
<!DOCTYPE customer [<!ENTITY xxe SYSTEM "file:///…/secret.txt">]>
<customer><firstName>&xxe;</firstName>…</customer>
Customer.firstName — o arquivo
vazou para o bean desserializado.DocumentBuilder reforçado (entidades externas e carregamento de DTD externo
desativados), então a entidade não é resolvida e o marcador nunca aparece.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: firstName = the marker file content; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-88901-smooks-xxe-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: firstName null, marker not leaked; >>> Not exploited
| Propriedade | Valor |
|---|---|
| Componente | camel-smooks (formato de dados e componente Smooks) |
| CWE | CWE-611 (Restrição Imprópria de Referência a Entidade Externa XML) |
| Severidade | ALTA |
| Vetor de ataque | Um remetente externo fornece o corpo da mensagem XML desmarshalled por um formato de dados ou endpoint camel-smooks usando o leitor XML padrão |
| Impacto | Leitura de arquivos locais legíveis pelo processo Camel; SSRF para hosts internos nomeados pelo documento |
| Versões Afetadas | De 4.7.0 antes de 4.18.5, de 4.19.0 antes de 4.22.1 |
| Versões Corrigidas | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24677 |
| Reportado por | h1ei1 |
Aviso: https://camel.apache.org/security/CVE-2026-88901.html
camel-smooks agora pré-analisa XML não confiável com um
javax.xml.parsers.DocumentBuilder configurado com FEATURE_SECURE_PROCESSING e com entidades gerais externas,
entidades de parâmetro externas e carregamento de DTD externo desabilitados, e entrega ao Smooks o DOM resultante — correspondendo à configuração
segura usada pelo XmlConverter e pelos outros componentes XML do Camel. O endurecimento se aplica apenas quando a configuração do Smooks
analisa XML com seu leitor padrão (portanto, configurações EDI, CSV, JSON e de leitor personalizado, e a
direção de marshalling, permanecem inalteradas). Uma nova opção allowExternalEntities, desabilitada por padrão, restaura o comportamento anterior
para configurações legadas confiáveis.
Não aplique camel-smooks a XML recebido de remetentes não confiáveis.
Este repositório é publicado para fins educacionais e defensivos: para ajudar 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" é criado pelo próprio reprodutor em um diretório temporário e contém apenas uma string marcadora benigna; ele é excluído após a verificação. Não use este material contra sistemas que você não possui ou opera.