
Reprodutor de prova de conceito para injeção de cabeçalho de despacho do Apache Camel camel-atmosphere-websocket (CVE-2026-71300), demonstrando como um cabeçalho injetado pode redirecionar mensagens WebSocket para um destinatário escolhido pelo atacante.
Reprodutor executável de prova de conceito para a vulnerabilidade do Apache Camel em que o produtor camel-atmosphere-websocket
seleciona seus destinatários WebSocket a partir de cabeçalhos de Exchange websocket.* cujos nomes estão fora do
namespace Camel — portanto, um HeaderFilterStrategy HTTP (que remove apenas Camel* / camel*) os admite, e um
remetente externo pode assumir a decisão de despacho do produtor.
| Runtime | Diretório | Stack |
|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-atmosphere-websocket 4.18.2 |
Camel Quarkus: não existe extensão
camel-quarkus-atmosphere-websocket, portanto este componente não pode ser executado no Camel Quarkus — o reprodutor é somente Spring Boot.
Uma rota faz a ponte entre um consumidor HTTP e um produtor atmosphere-websocket, entregando cada mensagem HTTP a um único
destinatário WebSocket fixo (a "vítima") ao definir o próprio cabeçalho websocket.connectionKey. Mas
WebsocketProducer.process testa o cabeçalho de lista websocket.connectionKey.list antes do cabeçalho de chave única,
e esse nome pontilhado não está no namespace Camel, portanto o filtro de cabeçalho HTTP não o remove. Um
cabeçalho websocket.connectionKey.list injetado passa então da requisição para o Exchange e sobrescreve
o destinatário fixo — a mensagem destinada à vítima é entregue a uma conexão escolhida pelo atacante.
POST /notify ──► setHeader(websocket.connectionKey = victim) ──► atmosphere-websocket producer ──► victim peer
│ ▲
└─ injected header websocket.connectionKey.list: <attacker key> ───────┘ (tested first → wins)
Sobre o harness de teste. O runtime WebSocket do atmosphere precisa do upgrade WebSocket do contêiner de servlets e da inicialização do próprio framework, que não pode ser conduzida a partir de um aplicativo Spring Boot autônomo simples. Este reprodutor portanto exercita a lógica real de despacho do
WebsocketProducersobre um ingresso HTTP real — apenas os dois peers conectados são substitutos registrados diretamente noWebSocketStoredo endpoint (como o atmosphere framework registraria conexões reais de navegador). A bypass do filtro de cabeçalhos e a precedência de despacho do produtor — a vulnerabilidade real — são exercitadas de verdade.
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 em uma build afetada:
1) Benign POST /notify (no injected header):
victim received: [hello for the victim]
attacker received: []
2) Injected POST /notify with header 'websocket.connectionKey.list: attacker-connection-key':
victim received: []
attacker received: [private data meant for the victim, ...]
>>> PROVEN: ... delivering a message meant for the victim to an attacker-chosen WebSocket connection instead: true
| Propriedade | Valor |
|---|---|
| Componente | camel-atmosphere-websocket (camel-atmosphere-websocket-starter) |
| CWE | CWE-20 (Validação de Entrada Incorreta) → CWE-74 (Injeção) |
| Vetor de ataque | Um cabeçalho websocket.connectionKey.list (ou websocket.connectionKey / websocket.sendToAll) injetado em uma requisição com ponte para um produtor atmosphere-websocket |
| Impacto | Assumir a decisão de despacho do produtor — entregar a / reter de peers WebSocket arbitrários |
| Versões afetadas | De 4.0.0 antes de 4.14.9, de 4.15.0 antes de 4.18.4, de 4.19.0 antes de 4.22.0 |
| Versões corrigidas | 4.14.9, 4.18.4, 4.22.0 |
| JIRA | CAMEL-24359 |
| Crédito | Barak Srour (Apiiro) |
Comunicado de segurança: https://camel.apache.org/security/CVE-2026-71300.html
As constantes de cabeçalho de despacho foram renomeadas para o namespace Camel — CamelAtmosphereWebsocketConnectionKey,
CamelAtmosphereWebsocketConnectionKeyList, CamelAtmosphereWebsocketSendToAll — para que o HTTP HeaderFilterStrategy
as remova na fronteira de transporte e um remetente externo não possa mais injetá-las. O relacionado
caminho websocket do camel-undertow é coberto por
CVE-2026-78329.
Este repositório é publicado para fins educacionais e defensivos: ajudar usuários do Apache Camel a entender a vulnerabilidade, verificar se são afetados e confirmar que a atualização resolve o problema. Não use este material contra sistemas que você não possui ou opera.