
Prova de conceito executável em Spring Boot que reproduz o CVE-2026-85245, uma divulgação de dados entre exchanges no camel-thrift, com comparação entre versões afetadas e corrigidas e notas de mitigação.
Reprodutor de prova de conceito executável para a vulnerabilidade do Apache Camel em que o formato de dados Thrift era desserializado
no defaultInstance compartilhado do tipo de destino, em vez de em uma cópia nova, e retornava esse objeto compartilhado
como corpo da exchange. Como a instância é compartilhada em todo o processo, o estado gravado durante a desserialização de uma mensagem
permanecia no objeto e era visível para todas as mensagens posteriores que usassem o mesmo tipo. Campos ausentes em um payload
posterior mantinham os valores da mensagem anterior, de modo que o conteúdo pertencente a um remetente podia ser lido durante o processamento
da mensagem de outro remetente, e exchanges concorrentes podiam observar o estado parcialmente gravado umas das outras. Em uma
implantação que atende mais de um tenant ou usuário pela mesma rota, isso é a divulgação dos dados de uma parte para
outra.
Somente Spring Boot. Não existe extensão
camel-quarkus-thrift, portanto este reprodutor inclui um único módulo Camel Spring Boot. (A falha está noThriftDataFormatdo componente, que é independente de runtime.)
| Runtime | Diretório | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-thrift 4.22.0 (afetado; corrigido em 4.22.1) |
Uma rota define um único ThriftDataFormat (respaldado pelo tipo Thrift gerado Work) e o reutiliza para cada mensagem,
como as rotas normalmente fazem. Dois tenants enviam uma mensagem por ele:
Work{num1=1, op=ADD, comment="TENANT-A-SECRET-…"} — o campo opcional comment carrega dados
sensíveis;Work{num1=3, op=SUBTRACT} — sem o campo comment.A rota desserializa a mensagem do tenant A e, em seguida, a do tenant B.
comment do tenant A — o Thrift apenas atribui os
campos presentes nos bytes recebidos, e ambas as mensagens foram desserializadas na (e retornadas como a) mesma instância
compartilhada, de modo que o campo ausente de B manteve o valor de A. Os dois corpos são literalmente o mesmo objeto.comment do tenant B é null — cada exchange recebe sua própria cópia limpa.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: B sees A's secret; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85245-thrift-cross-exchange-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: B's comment is null; >>> Not exploited
| Propriedade | Valor |
|---|---|
| Componente | camel-thrift (ThriftDataFormat.unmarshal) |
| CWE | CWE-488 (Exposição de Elemento de Dados à Sessão Errada) |
| Severidade | MÉDIA |
| Vetor de ataque | Duas mensagens do mesmo tipo Thrift através de uma rota; uma mensagem posterior que omite um campo herda o valor da anterior |
| Impacto | Divulgação de dados entre trocas / entre inquilinos; trocas concorrentes podem observar o estado parcialmente escrito umas das outras |
| 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-24442 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-85245.html
Os tipos Thrift gerados (Work, Operation) são os fixtures de teste públicos dos próprios testes camel-thrift do Apache Camel.
ThriftDataFormat.unmarshal agora desserializa em uma cópia por troca:
TBase instance = defaultInstance.deepCopy(); instance.clear(); — em seguida, desserializa os bytes em instance e
o retorna. Cada troca recebe seu próprio objeto limpo, de modo que nenhum campo é transportado entre mensagens e nenhuma
duas trocas compartilham um corpo.
Copie o corpo desserializado para uma nova instância imediatamente após a execução do formato de dados, e não retenha referências ao objeto retornado.
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 "segredo" é uma string marcadora inerte e fictícia. Não use este material contra sistemas que você não possui ou opera.