
Lauffähiger Spring Boot- und Quarkus-Proof-of-Concept, der die Authentifizierungs-Umgehung von Apache Camel camel-shiro bei threadgebundenen Subjekten reproduziert, mit betroffenen und gepatchten Kontrollen.
Lauffähiger Proof-of-Concept-Reproduzierer für die Apache-Camel-Schwachstelle, bei der der Shiro-Sicherheitsprozessor die
Anmeldeinformationsprüfung übersprang, wenn das bereits an den aktuellen Thread gebundene Shiro-Subject denselben
Principal wie der eingehende Exchange trug. Da der Thread, der einen Camel-Exchange trägt, aus einem Pool bezogen und
über Exchanges hinweg wiederverwendet wird, konnte ein von einem früheren authentifizierten Exchange hinterlassenes
gebundenes Subject die Prüfung für einen späteren Exchange erfüllen, der keine eigenen gültigen Anmeldeinformationen
vorlegte — das Passwort dieses späteren Exchanges wurde nie verifiziert. Der Angreifer muss lediglich eine Anfrage
senden, die einen Principal benennt, der gerade aktiv verwendet wird.
| Laufzeitumgebung | Verzeichnis | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-shiro 4.22.0 (betroffen; behoben in 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-shiro (Camel 4.15.0, betroffen; behobene Kontrolle CQ 3.40.0 / Camel 4.22.1) |
Beide Module demonstrieren sowohl das betroffene als auch das behobene Verhalten.
Eine Route ist durch eine ShiroSecurityPolicy geschützt, die mit alwaysReauthenticate=false erstellt wurde — dem
dokumentierten Modus, in dem das authentifizierte Subject bewusst an den (gepoolten, wiederverwendeten) Worker-Thread
zwischen Exchanges gebunden bleibt. Der Exploit-Treiber führt innerhalb eines HTTP-Worker-Threads zwei Exchanges
nacheinander aus:
ringo mit dem korrekten Passwort starr — sie authentifiziert sich und hinterlässt
das Shiro-Subject an diesen Thread gebunden (wie es eine vorherige authentifizierte Anfrage in einem ausgelasteten
Dienst tun würde);ringo, aber mit einem falschen Passwort not-starr benennt,
auf dem selben Thread.AuthenticationException abgelehnt, obwohl derselbe Benutzer noch an den Thread gebunden ist.# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: wrong password reaches protected logic; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-84181-shiro-auth-bypass-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: wrong password rejected; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.15.0): wrong password reaches protected logic
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: wrong password rejected
| Eigenschaft | Wert |
|---|---|
| Komponente | camel-shiro (ShiroSecurityProcessor.authenticateUser) |
| CWE | CWE-287 (Improper Authentication) |
| Schweregrad | MITTEL |
| Angriffsvektor | Eine Anfrage, die einen Principal benennt, der aktuell an einen wiederverwendeten Worker-Thread gebunden ist, und die keine eigenen gültigen Anmeldedaten mitführt |
| Auswirkung | Umgehung der Authentifizierung: Eine nicht authentifizierte Anfrage wird als bereits gebundener Principal akzeptiert; ihr Passwort wird nie überprüft |
| Betroffene Versionen | Ab 4.0.0 vor 4.18.5, ab 4.19.0 vor 4.22.1 |
| Behobene Versionen | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24439 |
| Danksagung | Claude Security Scan Tool |
Advisory: https://camel.apache.org/security/CVE-2026-84181.html
ShiroSecurityProcessor.authenticateUser überspringt den Login nicht mehr,
wenn das thread-gebundene Subject bereits denselben Principal trägt. Der vorherige Code brach vorzeitig ab bei
currentUser.isAuthenticated() && username.equals(currentUser.getPrincipal()); ein übereinstimmender Benutzername sagt
nichts über das Passwort aus, das mit diesem Exchange übergeben wird. Der Processor ruft nun currentUser.login(token)
bei jedem Exchange auf, sodass die übergebenen Anmeldedaten stets überprüft werden. alwaysReauthenticate steuert
weiterhin die rememberMe-Lebensdauer des Subjects, aber es entscheidet nicht mehr darüber, ob das Passwort geprüft wird.
Stellen Sie sicher, dass das Shiro-Subject am Ende jedes Exchanges vom Thread entfernt wird (sodass kein Subject von
einem späteren Exchange geerbt werden kann) — zum Beispiel mit einem onCompletion/Processor, der Shiro's
ThreadContext.unbindSubject() aufruft — bis Sie aktualisieren können.
Dieses Repository wird zu Bildungs- und Verteidigungszwecken veröffentlicht: um Apache Camel-Nutzern zu helfen, die Schwachstelle zu verstehen, zu prüfen, ob sie betroffen sind, und zu bestätigen, dass ein Upgrade sie behebt. Die Benutzer, Passwörter und Schlüssel hier sind inaktive lokale Testdaten. Verwenden Sie dieses Material nicht gegen Systeme, die Ihnen nicht gehören oder die Sie nicht betreiben.