
Preuve de concept exécutable pour CVE-2026-80312, une garde OAuth à défaillance ouverte (fail-open) dans Apache Camel camel-oauth, avec des reproducers Spring Boot et Quarkus affectés et corrigés.
Reproducteur de preuve de concept exécutable pour la vulnérabilité Apache Camel où les processeurs camel-oauth qui protègent
une route n'arrêtaient pas l'échange lorsque l'authentification ne pouvait pas être complétée. Là où un échec d'établissement d'une
session authentifiée aurait dû terminer le routage et renvoyer une erreur, le processeur définissait un code de réponse mais
rendait le contrôle à la route — la requête continuait donc vers le point de terminaison protégé comme si l'authentification avait
réussi. Le résultat est une garde d'authentification à défaillance ouverte (fail-open) : un appelant non authentifié atteint ce que la route
fait ensuite, sur le chemin de requête ordinaire, sans configuration particulière.
| Runtime | Répertoire | Pile |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-oauth 4.22.0 (affecté ; corrigé en 4.22.1), HTTP via camel-undertow |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-oauth 3.39.0 (Camel 4.22.0, affecté ; corrigé dans le contrôle 3.40.0 / Camel 4.22.1), HTTP via camel-quarkus-platform-http |
Les deux modules démontrent le comportement affecté et le comportement corrigé. (Le module Spring Boot utilise camel-undertow comme
transport HTTP — la garde est agnostique au transport, et camel-platform-http-starter 4.22.0 est compilé contre une
ligne Spring Boot différente de la 3.5.x.)
Une route expose /protected, protégée par OAuthBearerTokenProcessor ; seule une requête authentifiée devrait atteindre les
étapes protégées qui suivent. L'attaquant envoie GET /protected sans en-tête Authorization.
exchange.setRouteStop(true), la route
passait donc aux étapes protégées → HTTP 200 et le corps protégé.rejectUnauthorized(...), qui répond 401 et arrête la route → les étapes protégées
ne s'exécutent jamais.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 le build affecté :
Sent: GET /protected (NO Authorization header)
Response status: 200
Response body : PROTECTED-DATA: reached the protected endpoint WITHOUT authenticating
>>> PROVEN: the OAuth guard failed open ...
Sur le build corrigé : Response status: 401, corps Authorization header, les étapes protégées ne se sont jamais exécutées.
| Propriété | Valeur |
|---|---|
| Composant | camel-oauth (processeurs de garde de route, par ex. OAuthBearerTokenProcessor) |
| CWE | CWE-287 (Authentification incorrecte) |
| Sévérité | ÉLEVÉE |
| Vecteur d'attaque | Une requête ordinaire vers une route protégée par OAuth où l'authentification ne peut pas être complétée (ici : absence d'en-tête Authorization) |
| Impact | Accès non authentifié au point de terminaison protégé (contournement d'authentification) |
| Versions affectées | À partir de 4.11.0 avant 4.18.5, à partir de 4.19.0 avant 4.22.1 |
| Versions corrigées | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24411 |
| Crédit | Claude Security Scan Tool |
Avis de sécurité : https://camel.apache.org/security/CVE-2026-80312.html
Les processeurs de garde appellent désormais rejectUnauthorized(...) / reject(...) sur chaque chemin où l'authentification ne peut pas être complétée, ce qui définit le statut HTTP (401) et appelle exchange.setRouteStop(true) afin qu'aucune étape ultérieure ne s'exécute pour une requête que le processeur n'a pas authentifiée. « L'absence d'informations d'identification doit être rejetée au moins aussi fermement que des informations d'identification invalides. »
Placez une vérification d'autorisation explicite après la garde, ou assurez-vous que la route se termine lorsque la propriété d'échange CamelOAuthUserProfile est absente, jusqu'à ce que vous puissiez mettre à 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 contenu contre des systèmes que vous ne possédez pas ou n'exploitez pas.