
Reprodutores de prova de conceito para a injeção de cabeçalho em CloudEvent estruturado do Apache Camel camel-knative (CVE-2026-63621), demonstrando injeção de cabeçalho por meio de campos de extensão maliciosos nos runtimes Spring Boot e Quarkus.
Reprodutores executáveis de prova de conceito para a mesma vulnerabilidade do Apache Camel, um por runtime:
| Runtime | Diretório | Stack | Estilo |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-knative 4.18.2 | decodificação direta (ver nota) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.36.0 + Camel Quarkus 3.36.0 (inclui Camel 4.20.0) | fonte knative totalmente orientada por HTTP |
Ambas são versões afetadas (o problema é corrigido em 4.14.9 / 4.18.4 / 4.22.0), e ambas demonstram o mesmo
defeito: o consumidor camel-knative aceita CloudEvents em dois modos de conteúdo. No modo binário, os atributos
chegam como cabeçalhos HTTP e são mapeados por meio de uma HeaderFilterStrategy, de modo que os cabeçalhos Camel*
são descartados. No modo estruturado (Content-Type: application/cloudevents+json), o evento inteiro é um corpo
JSON, e a build afetada mapeia cada campo de extensão desse JSON para os cabeçalhos da mensagem com
setHeader(key.toLowerCase(Locale.US), value) e sem HeaderFilterStrategy. Os nomes das extensões são escolhidos
pelo remetente, portanto um atacante pode definir um cabeçalho de controle interno do Camel. Aqui, a extensão injetada
camelsqlquery torna-se o cabeçalho CamelSqlQuery (os cabeçalhos do Camel não diferenciam maiúsculas de minúsculas) —
a instrução que um produtor camel-sql executaria (injeção de cabeçalho → CWE-74).
Nota sobre a variante Spring Boot. O transporte HTTP knative é baseado em Vert.x e é usado em implantações camel-main / Camel Quarkus. Uma aplicação servlet Spring Boot não hospeda esse transporte, por isso o reprodutor Spring Boot aciona a decodificação vulnerável exata (
CloudEventProcessors.fromSpecVersion("1.0").consumer(...)) diretamente — o mesmo caminho de código que uma requisiçãoapplication/cloudevents+jsonde entrada aciona dentro do consumidor knative. A variante Camel Quarkus é o reprodutor totalmente orientado por HTTP (faça POST de um CloudEvent para a fonte ativa).
cd camel-spring-boot # or: cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Saída esperada em uma build afetada (ambas as variantes):
1) Benign structured CloudEvent (no extension):
CamelSqlQuery ... = [null]
2) Malicious structured CloudEvent (injected extension 'camelsqlquery'):
CamelSqlQuery ... = [SELECT * FROM secrets WHERE 1=1 -- injected-by-attacker]
>>> PROVEN: ... a camel-sql producer downstream would execute this attacker-supplied statement: true
| Propriedade | Valor |
|---|---|
| Componente | camel-knative (Spring Boot: camel-knative; Quarkus: camel-quarkus-knative) |
| CWE | CWE-20 (Validação de Entrada Incorreta) → CWE-74 (Injeção) |
| Vetor de ataque | Um CloudEvent em modo estruturado (application/cloudevents+json) com um campo de extensão escolhido pelo atacante |
| Impacto | Injeção de cabeçalhos de controle internos do Camel no Exchange (aqui CamelSqlQuery) |
| Versões afetadas | De 3.15.0 até antes de 4.14.9, de 4.15.0 até antes de 4.18.4, de 4.19.0 até antes de 4.22.0 |
| Versões corrigidas | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-24084 |
| Crédito | Andrea Cosentino (Apache Software Foundation) |
O mapeamento de extensões no modo estruturado agora executa cada campo por meio de uma HeaderFilterStrategy (uma
DefaultHeaderFilterStrategy) antes de defini-lo, consistente com o caminho do modo de conteúdo binário — portanto, os nomes de extensão Camel*
do corpo não confiável são descartados:
// fixed (AbstractCloudEventProcessor.mapExtensionAsHeader)
final String headerName = key.toLowerCase(Locale.US);
if (!headerFilterStrategy.applyFilterToExternalHeaders(headerName, value, exchange)) {
message.setHeader(headerName, value);
}
Este repositório é publicado para fins educacionais e defensivos: 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 valor injetado é um marcador benigno (uma string SQL inerte que nunca é executada aqui). Não use este material contra sistemas que você não possui ou opera.