
Lauffähiger Proof-of-Concept-Reproduzierer für CVE-2026-85312, der Saga-Hijacking in Apache Camel über den Long-Running-Action-Header in Spring Boot und Quarkus demonstriert.
Long-Running-Action-HeaderLauffähiger Proof-of-Concept-Reproduzierer für die Apache-Camel-Schwachstelle, bei der der SagaProcessor von camel-core den
Saga-Koordinator aus dem Long-Running-Action-Nachrichtenheader bei jedem Exchange auswählte. Dieser Headername trägt kein
Camel-Präfix, sodass er außerhalb des Namespace liegt, den Consumer-Header-Filter entfernen — ein externer Absender konnte
ihn auf einer eingehenden Nachricht mitliefern und dadurch die Saga benennen, der sich sein Exchange anschließt, wodurch
seine Anfrage an eine von jemand anderem gestartete langlaufende Aktion angehängt wird (oder eine Kompensation mit einer
Aktion verknüpft wird, die er nicht initiiert hat). Die Exposition ist auf Deployments beschränkt, die Sagas ausführen, aber
wo sie zutrifft, steuert der Absender, zu welcher Saga ein Exchange gehört (CWE-20).
| Laufzeitumgebung | Verzeichnis | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-spring-boot 4.22.0 (betroffen; behoben in 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-saga (Camel 4.22.0, betroffen; behobene Kontrolle CQ 3.40.0 / Camel 4.22.1) |
Beide Module demonstrieren das betroffene und das behobene Verhalten gegenüber dem echten SagaProcessor von camel-core.
Der Treiber bildet den eigenen Regressionstest des Fixes nach (SagaHeaderCannotSelectCoordinatorTest). Er baut eine Saga-Route
from("direct:…").saga().propagation(MANDATORY) auf, gestützt auf einen In-Memory-Saga-Service, der jede ID aufzeichnet, deren
Auflösung von ihm verlangt wird, und sendet dann einen Exchange mit dem eingehenden Header Long-Running-Action = a-saga-id-from-the-wire
— die ID, die ein externer Absender auf die Leitung legen würde. Das Orakel ist schlicht welche Saga-IDs den Service erreichen:
a-saga-id-from-the-wire nachgeschlagen wird
— die Nachricht wählte den Koordinator.In beiden Builds schlägt der MANDATORY-Exchange letztlich fehl (es gibt keine echte Saga, der man beitreten könnte) — die Schwachstelle ist nicht der
Fehlschlag, sondern dass überhaupt eine vom Angreifer gewählte ID zur Auswahl des Koordinators verwendet wurde, weshalb das Orakel den
Lookup beobachtet und nicht das Ergebnis.
# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: wire id looked up = true; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85312-saga-header-hijack-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: wire id looked up = false; >>> 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.22.0): wire id looked up = true
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: wire id looked up = false
| Eigenschaft | Wert |
|---|---|
| Komponente | camel-core (SagaProcessor.getCurrentSagaCoordinator) |
| CWE | CWE-20 (Unzureichende Eingabevalidierung) |
| Schweregrad | MITTEL |
| Angriffsvektor | Ein externer Absender liefert den Header Long-Running-Action ohne Präfix in einer eingehenden Nachricht an eine Route, die die Saga-EIP ausführt |
| Auswirkung | Der Absender bestimmt die Saga, der ein Exchange beitritt — er hängt sich an die langlaufende Aktion einer anderen Partei an oder ordnet die Kompensation falsch zu |
| 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-24449 |
| Danksagung | Claude Security Scan Tool |
Advisory: https://camel.apache.org/security/CVE-2026-85312.html
Das betroffene Quarkus-Modul basiert auf CQ 3.39.0 (Camel 4.22.0). Die korrigierte Kontrolle ist CQ 3.40.0 (Camel 4.22.1).
SagaProcessor konsultiert den Header Long-Running-Action jetzt nur noch dann, wenn
der Saga-Dienst angibt, dass er an einem solchen Protokoll teilnimmt, und zwar über die neue Methode
CamelSagaService.isLongRunningActionHeaderSupported() (Standard false; der LRA-Dienst überschreibt sie mit true). Der
interne Exchange-Zustand — der removeHeaders("*") übersteht — bleibt der normale Träger der Saga-ID, sodass eine Nachricht
nicht mehr den Koordinator für einen Dienst auswählen kann, der keinen externen Koordinator betreibt.
Entfernen Sie den Header an der Vertrauensgrenze mit removeHeaders("Long-Running-Action") bei jedem Consumer, der
Nachrichten von einem nicht vertrauenswürdigen Absender akzeptiert.
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 Demonstration führt eine Saga- Route prozessintern mit einem In-Memory-Saga-Dienst aus; die „Angreifer“-Saga-ID ist eine harmlose Platzhalterzeichenkette. Verwenden Sie dieses Material nicht gegen Systeme, die Ihnen nicht gehören oder die Sie nicht betreiben.