
Lauffähiger Proof-of-Concept-Reproduzierer für CVE-2026-85315, der die Offenlegung von Exception-Meldungen bei camel-grpc-Consumern (CWE-209) in Camel Spring Boot und Quarkus demonstriert.
Lauffähiger Proof-of-Concept-Reproduzierer für die Apache-Camel-Schwachstelle, bei der – wenn eine Route hinter einem gRPC-Consumer fehlschlug – die Nachricht der Route-Ausnahme in die gRPC-Status-Beschreibung kopiert wurde. Anders als die Status-Ursache (withCause(...)), die lokal auf dem Server verbleibt, wird die Beschreibung an den aufrufenden Client übertragen, sodass ein externer Aufrufer, der einen Fehler provozieren kann, die interne Fehlermeldung lesen konnte – in der Praxis Klassen- und Paketnamen, Dateipfade, Hostnamen und Verbindungsdetails, die in Ausnahmemeldungen enthalten sind (CWE-209). Dies ist das gRPC-Mitglied derselben Familie nicht stummgeschalteter Consumer-Ausnahmen wie die knative-, mina- und CXF-Advisories, die zusammen mit ihr veröffentlicht wurden.
| Laufzeitumgebung | Verzeichnis | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-grpc 4.22.0 (betroffen; behoben in 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-grpc (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 camel-grpc-Consumer.
Jedes Modul betreibt einen camel-grpc-Consumer (den PingPong-Dienst aus dem eigenen Test-Proto von camel-grpc), dessen Route stets mit einer intern wirkenden Nachricht fehlschlägt:
Internal failure contacting jdbc:postgresql://db.internal.local:5432 (user=svc_admin) [CVE-2026-85315]
Der Verifier-Endpunkt /exploit/attack spielt einen externen gRPC-Client: Er ruft PingSyncSync auf, fängt die
StatusRuntimeException ab und meldet den Status-Code und die Beschreibung, die der Server zurückgesendet hat.
muteException ist standardmäßig auf true gesetzt, sodass die Beschreibung die generische
"Exchange processing failed" ist und die echte Nachricht den Server nie verlässt (sie wird nur in der ausschließlich lokalen
Status-Ursache beibehalten).# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: description leaks the internal message; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85315-grpc-exception-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: description is "Exchange processing failed"; >>> 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): description leaks the internal message
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: description is "Exchange processing failed"
Jedes Modul stellt den Verifier auf 8080 bereit und führt den camel-grpc-Consumer auf 50051 im selben Prozess aus; nur
8080 wird veröffentlicht.
| Eigenschaft | Wert |
|---|---|
| Komponente | camel-grpc (GrpcMethodHandler, Consumer) |
| CWE | CWE-209 (Erzeugung einer Fehlermeldung, die sensible Informationen enthält) |
| Schweregrad | MITTEL |
| Angriffsvektor | Ein externer gRPC-Client löst einen Routenfehler aus und liest die übertragene Status-Beschreibung |
| Auswirkung | Interne Fehlerdetails (Klassen-/Paketnamen, Pfade, Hostnamen, Verbindungsdetails) werden an den Aufrufer offengelegt |
| 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-24478 |
| Danksagung | Claude Security Scan Tool |
Advisory: https://camel.apache.org/security/CVE-2026-85315.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).
GrpcMethodHandler fügt eine Consumer-Option muteException hinzu (Standard
true). Wenn sie aktiviert ist, liefert ein fehlgeschlagener Exchange die generische Beschreibung "Exchange processing failed" im
übertragenen Status; die Routenausnahme wird weiterhin lokal über withCause(...) angehängt, was gRPC nicht an
den Client sendet. Setzen Sie muteException=false am Endpoint, um das vorherige Verhalten wiederherzustellen.
Ordnen Sie Fehler in einem onException-Handler einem expliziten Status zu, damit das Framework niemals die Ausnahmemeldung
in die Beschreibung kopiert.
Dieses Repository wird zu Bildungs- und Verteidigungszwecken veröffentlicht: um Apache Camel-Benutzern zu helfen, die
Schwachstelle zu verstehen, zu überprüfen, ob sie betroffen sind, und zu bestätigen, dass ein Upgrade sie behebt. Die „interne“ Meldung ist ein
harmloser Platzhalter (db.internal.local, svc_admin) und die gesamte Demonstration läuft in einem Prozess. Verwenden Sie dieses
Material nicht gegen Systeme, die Ihnen nicht gehören oder die Sie nicht betreiben.