
Reprodutor executável em Spring Boot e Quarkus para a CVE-2026-85249, demonstrando a injeção de cabeçalho de metadados do camel-tika no CamelFileName com controles afetados e corrigidos.
CamelFileName)Reprodutor de prova de conceito executável para a vulnerabilidade do Apache Camel em que o produtor Tika mapeava cada
chave de metadados extraída do documento submetido para o Exchange como um cabeçalho, sem nenhum filtro aplicado. Os
metadados do documento são conteúdo controlado pelo atacante: a parte que fornece o arquivo escolhe as chaves de metadados
que ele carrega. Um documento forjado poderia, portanto, definir cabeçalhos do Exchange dos quais o restante da rota
depende, incluindo cabeçalhos do namespace Camel, como CamelFileName, que componentes downstream usam para decidir
onde o conteúdo é gravado. É a mesma classe de injeção de cabeçalho dos avisos de consumidor, alcançada aqui por meio do
conteúdo de arquivo analisado, em vez de um cabeçalho de protocolo.
| Runtime | Diretório | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-tika 4.22.0 (afetado; corrigido em 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-tika (Camel 4.22.0, afetado; controle corrigido CQ 3.40.0 / Camel 4.22.1) |
Ambos os módulos demonstram o comportamento afetado e o corrigido.
O atacante submete um documento HTML — um atributo HTML <meta name="..."> chega aos metadados do Tika literalmente, de
modo que o documento escolhe os nomes dos cabeçalhos:
<meta name="CamelFileName" content="ATTACKER-SET-../../pwned.txt"/>
<meta name="author" content="legitimate-metadata"/>
A rota é simplesmente from(...).to("tika:parse"). Após o parsing, os cabeçalhos do Exchange são inspecionados.
CamelFileName (Exchange.FILE_NAME) é definido com o valor do atacante proveniente do documento. Um produtor
de arquivos a jusante usaria esse valor escolhido pelo atacante para decidir onde o conteúdo é gravado.CamelFileName é filtrado (não é definido a partir do documento), enquanto metadados comuns como author
continuam sendo mapeados — o filtro bloqueia apenas o namespace interno do Camel.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: document sets CamelFileName; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85249-tika-header-injection-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: CamelFileName filtered; >>> 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.22.0): document sets CamelFileName
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: CamelFileName filtered
| Propriedade | Valor |
|---|---|
| Componente | camel-tika (TikaProducer.convertMetadataToHeaders) |
| CWE | CWE-20 (Validação de Entrada Imprópria) |
| Severidade | MÉDIA |
| Vetor de ataque | Um documento submetido cujos metadados analisados declaram nomes de cabeçalhos internos do Camel (por exemplo, via HTML <meta name="CamelFileName">) |
| Impacto | Injeção de cabeçalho: um documento define cabeçalhos do Exchange dos quais a rota depende, como CamelFileName, que decide onde os componentes downstream gravam o conteúdo |
| Versões Afetadas | Da 4.0.0 anterior à 4.18.5, da 4.19.0 anterior à 4.22.1 |
| Versões Corrigidas | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24423 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-85249.html
TikaProducer.convertMetadataToHeaders agora filtra cada nome de metadado analisado
por meio de um HeaderFilterStrategy (configurado com inFilterStartsWith("Camel", "camel", "org.apache.camel."),
sem distinção entre maiúsculas e minúsculas) antes de mapeá-lo para o Exchange — da mesma forma que um consumidor filtra nomes fornecidos por um
remetente externo — de modo que um documento não pode declarar um nome de metadado que caia no namespace interno do Camel. Metadados fora desse
namespace ainda são mapeados.
Remova o namespace Camel após o produtor Tika com removeHeaders("Camel*") antes de qualquer componente que atue sobre
esses cabeçalhos.
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 documento elaborado e o nome de arquivo injetado são fixtures locais inertes. Não use este material contra sistemas que você não possui ou opera.