
CVE-2026-23552 - Cross-Realm Token Acceptance in camel-keycloak
Die KeycloakSecurityPolicy von Apache Camel validiert den iss-Anspruch (Issuer) von JWT-Tokens nicht gegen die konfigurierte Realm. Das bedeutet, dass ein Token, das von einer Keycloak-Realm ausgestellt wurde, stillschweigend von einer Richtlinie akzeptiert wird, die für eine völlig andere Realm konfiguriert ist, wodurch die Mandantenisolation aufgehoben wird.
Betroffene Versionen: 4.15.0, 4.16.0, 4.17.0
Verfolgt unter: https://issues.apache.org/jira/browse/CAMEL-22854
In KeycloakSecurityHelper.parseAccessToken() wird das Token, wenn kein öffentlicher Schlüssel explizit angegeben wird (was der Standardkonfiguration entspricht), nur aus Base64 dekodiert -- es wird niemals verifiziert:
public static AccessToken parseAccessToken(String tokenString, PublicKey publicKey)
throws VerificationException {
if (publicKey != null) {
return TokenVerifier.create(tokenString, AccessToken.class)
.publicKey(publicKey)
.verify()
.getToken();
} else {
// no signature verification, no issuer check
return TokenVerifier.create(tokenString, AccessToken.class).getToken();
}
}
Da der Standardcodepfad den else-Zweig erreicht, bleiben drei Dinge ungeprüft:
iss-Anspruch wird nie mit dem erwarteten {serverUrl}/realms/{realm} verglichenDie Rollenprüfung besteht trotzdem, weil sie nur die Rollennamen innerhalb der Token-Nutzlast betrachtet. Wenn der Rollenname (tenant-user) zufällig über Realms hinweg übereinstimmt -- was in Multi-Tenant-Setups häufig vorkommt -- wird die Anfrage durchgelassen.
In einer Multi-Tenant-Anwendung, bei der jeder Mandant einer separaten Keycloak-Realm zugeordnet ist, kann ein Benutzer von Mandant A auf Routen zugreifen, die für Mandant B geschützt sind. Konkret:
Dieses Projekt demonstriert die Schwachstelle mit Apache Camel 4.17.0 und einer lokalen Keycloak-Instanz.
jbang app install camel@apache/camel)camel infra unter der Haube verwendet)Eine lokale Keycloak-Instanz starten:
camel infra run keycloak
Dies startet Keycloak auf localhost:8080 mit den Admin-Zugangsdaten admin/admin.
mvn verify
Der Integrationstest (CrossRealmTokenBypassIT) führt Folgendes aus:
acme und globextenant-user in beiden Realmsalice (Passwort alice123) in der acme-Realm und weist ihr die Rolle tenant-user zudirect:globex-protected) ein, die durch eine an die globex-Realm gebundene KeycloakSecurityPolicy geschützt istalice von der acme-Realm (Issuer: http://localhost:8080/realms/acme)Die Anfrage ist erfolgreich. Das acme-Token passiert die globex-Richtlinie ohne Fehler.
| Test | Result | Meaning |
|---|
Bei einer gepatchten Version (4.18.0+) würde der zweite Test fehlschlagen und der dritte bestehen.
camel infra stop keycloak
Der Test entfernt außerdem die acme- und globex-Realms in @AfterAll.
Die KeycloakSecurityPolicy sollte Tokens ablehnen, bei denen der iss-Anspruch nicht mit {serverUrl}/realms/{realm} übereinstimmt. Der Fix wird in CAMEL-22854 verfolgt und mit Camel 4.18.0 (dem nächsten LTS-Release) ausgeliefert.
testAcmeTokenIsObtainable | PASS | Plausibilitätsprüfung -- Token-Beschaffung funktioniert |
testCrossRealmTokenAccepted | PASS | Bestätigt, dass die Schwachstelle vorhanden ist |
testCrossRealmTokenShouldBeRejected | FAIL | Dokumentiert das korrekte Verhalten -- unter 4.17.0 wird keine Ausnahme ausgelöst |