
Preuve de concept exécutable pour CVE-2026-80343, un contournement de la sensibilité à la casse des contraintes de sécurité de camel-netty-http, avec des reproducers Spring Boot et Quarkus et une vérification du correctif.
Reproducteur de preuve de concept exécutable pour la vulnérabilité d'Apache Camel où la contrainte de sécurité de camel-netty-http comparait le chemin de la requête au chemin de contexte configuré en utilisant une correspondance sensible à la casse, tandis que le routage qui achemine la requête vers le point de terminaison n'appliquait pas la même règle. Les deux comparaisons divergent pour tout chemin dont la casse diffère de la valeur configurée : un appelant externe peut modifier la casse d'un caractère dans le segment du chemin de contexte afin que la contrainte de sécurité ne reconnaisse plus le chemin comme protégé, tandis que la requête est toujours acheminée vers le même point de terminaison. La contrainte est ignorée et la route protégée est atteinte sans la satisfaire — aucun identifiant, aucun accès préalable ni configuration spéciale requis.
| Runtime | Répertoire | Pile |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-netty-http 4.22.0 (affecté ; corrigé en 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-netty-http 3.29.0 (Camel 4.15.0, affecté ; contrôle corrigé 3.40.0 / Camel 4.22.1) |
Un consommateur netty-http écoute sur le chemin de contexte /app et est protégé par un SecurityConstraintMapping qui protège /secret (relatif au point de terminaison) avec un authentificateur rejetant. Les deux requêtes ci-dessous ne portent aucun identifiant :
GET /app/secret (casse configurée) → la contrainte le reconnaît comme protégé → 401.GET /App/secret (casse du chemin de contexte modifiée) → le extractTarget du gestionnaire ne retire le chemin de contexte que sur un startsWith sensible à la casse, donc le retrait est ignoré et la contrainte ne reconnaît pas le chemin comme protégé → le routeur l'achemine toujours vers le point de terminaison /app → 200 et le corps protégé, sans authentification.Sur la version corrigée, les deux requêtes renvoient 401.
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
Sortie attendue sur la version affectée :
Configured case GET /app/secret -> status 401, body:
Altered case GET /App/secret -> status 200, body: PROTECTED-ADMIN-DATA: reached the protected endpoint
>>> PROVEN: /app/secret is correctly rejected (401), but /App/secret bypassed the security constraint ...
| Propriété | Valeur |
|---|---|
| Composant | camel-netty-http |
| CWE | CWE-178 (Gestion incorrecte de la sensibilité à la casse) |
| Gravité | ÉLEVÉE |
| Vecteur d'attaque | Une requête dont la casse du chemin de contexte diffère du chemin de point de terminaison configuré |
| Impact | Contrainte de sécurité ignorée ; route protégée atteinte sans authentification |
| Versions affectées | De 4.0.0 avant 4.18.5, de 4.19.0 avant 4.22.1 |
| Versions corrigées | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24412 |
| Crédit | Claude Security Scan Tool |
Avis de sécurité : https://camel.apache.org/security/CVE-2026-80343.html
La contrainte de sécurité et la gestion du chemin de contexte comparent désormais le chemin de manière cohérente (sans tenir compte de la casse sur le chemin de contexte), de sorte qu'une requête dont la casse est modifiée est reconnue comme protégée exactement comme sa forme à casse configurée et est soumise à la même authentification.
Appliquez l'autorisation dans la route elle-même plutôt que de vous fier uniquement à la contrainte de sécurité de netty-http, ou normalisez la casse du chemin de la requête avant le contrôle de sécurité, jusqu'à ce que vous puissiez effectuer la mise à jour.
Ce dépôt est publié à des fins éducatives et défensives : pour aider les utilisateurs d'Apache Camel à comprendre la vulnérabilité, à vérifier s'ils sont affectés et à confirmer que la mise à jour la résout. N'utilisez pas ce matériel contre des systèmes que vous ne possédez pas ou n'exploitez pas.