
Lauffähiger Spring-Boot-Proof-of-Concept zur Reproduktion von CVE-2026-85245, einer Offenlegung von Daten zwischen Austauschsystemen via camel-thrift, mit Vergleich zwischen betroffener und behobener Version sowie Hinweisen zur Risikominderung.
Lauffähiger Proof-of-Concept-Reproducer für die Apache-Camel-Schwachstelle, bei der das Thrift-Datenformat in die
gemeinsame defaultInstance des Zieltyps statt in eine frische Kopie unmarshalled wurde und dieses gemeinsame Objekt
als Exchange-Body zurückgab. Da die Instanz prozessweit geteilt wird, blieb der Zustand, der beim Unmarshalling einer
Nachricht geschrieben wurde, am Objekt haften und war für jede spätere Nachricht sichtbar, die denselben Typ
verwendete. Felder, die in einer späteren Payload fehlten, behielten die Werte der vorherigen Nachricht, sodass
Inhalte, die zu einem Absender gehörten, beim Verarbeiten der Nachricht eines anderen Absenders gelesen werden
konnten, und gleichzeitige Exchanges konnten den teilweise geschriebenen Zustand des jeweils anderen beobachten. In
einer Bereitstellung, die mehr als einen Mandanten oder Benutzer über dieselbe Route bedient, bedeutet das die
Offenlegung der Daten einer Partei gegenüber einer anderen.
Nur Spring Boot. Es gibt keine
camel-quarkus-thrift-Erweiterung, daher enthält dieser Reproducer ein einzelnes Camel-Spring-Boot-Modul. (Der Fehler liegt imThriftDataFormatder Komponente, das laufzeitunabhängig ist.)
| Laufzeit | Verzeichnis | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-thrift 4.22.0 (betroffen; behoben in 4.22.1) |
Eine Route definiert ein ThriftDataFormat (gestützt auf den generierten Thrift-Typ Work) und verwendet es für
jede Nachricht wieder, wie es Routen üblicherweise tun. Zwei Mandanten senden eine Nachricht darüber:
Work{num1=1, op=ADD, comment="TENANT-A-SECRET-…"} — das optionale Feld comment trägt sensible
Daten;Work{num1=3, op=SUBTRACT} — kein Feld comment.Die Route unmarshalled die Nachricht von Mandant A, dann die von Mandant B.
comment von Mandant A zurück — Thrift
weist nur die Felder zu, die in den eingehenden Bytes vorhanden sind, und beide Nachrichten wurden in dieselbe
gemeinsame Instanz deserialisiert (und als diese zurückgegeben), sodass Bs fehlendes Feld den Wert von A behielt.
Die beiden Bodies sind buchstäblich dasselbe Objekt.comment von Mandant B ist null — jeder Exchange erhält seine eigene bereinigte Kopie.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: B sees A's secret; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85245-thrift-cross-exchange-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: B's comment is null; >>> Not exploited
| Eigenschaft | Wert |
|---|---|
| Komponente | camel-thrift (ThriftDataFormat.unmarshal) |
| CWE | CWE-488 (Exposure of Data Element to Wrong Session) |
| Schweregrad | MITTEL |
| Angriffsvektor | Zwei Nachrichten desselben Thrift-Typs über eine Route; eine spätere Nachricht, die ein Feld auslässt, erbt den Wert der früheren |
| Auswirkung | Offenlegung von Daten zwischen Austauschen / Mandanten; gleichzeitige Austausche können den teilweise geschriebenen Zustand des jeweils anderen beobachten |
| 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-24442 |
| Danksagung | Claude Security Scan Tool |
Advisory: https://camel.apache.org/security/CVE-2026-85245.html
Die generierten Thrift-Typen (Work, Operation) sind die öffentlichen Test-Fixtures aus Apache Camels eigenen camel-thrift-Tests.
ThriftDataFormat.unmarshal deserialisiert nun in eine Kopie pro Austausch:
TBase instance = defaultInstance.deepCopy(); instance.clear(); — und deserialisiert dann die Bytes in instance und
gibt sie zurück. Jeder Austausch erhält sein eigenes geleertes Objekt, sodass kein Feld zwischen Nachrichten übertragen wird und keine zwei Austausche sich einen Body teilen.
Kopieren Sie den unmarshalled Body unmittelbar nach Ausführung des Datenformats in eine neue Instanz und behalten Sie keine Referenzen auf das zurückgegebene Objekt.
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. Das „Geheimnis“ ist eine inerte, erfundene Markierungszeichenfolge. Verwenden Sie dieses Material nicht gegen Systeme, die Ihnen nicht gehören oder die Sie nicht betreiben.