
أداة إثبات مفهوم قابلة للتشغيل لإعادة إنتاج CVE-2026-85315، تُظهر الكشف عن رسائل الاستثناء في مستهلك camel-grpc (CWE-209) في Camel Spring Boot وQuarkus.
مُعيد إنتاج قابل للتشغيل لإثبات المفهوم لثغرة Apache Camel حيث، عندما تفشل مسار (route) خلف مستهلك gRPC،
كانت رسالة استثناء المسار تُنسخ إلى وصف Status الخاص بـ gRPC. وعلى عكس السبب (cause) في الحالة
(withCause(...))، الذي يبقى محليًا على الخادم، فإن الوصف يُنقل إلى العميل المُستدعي، لذا فإن
المُستدعي الخارجي القادر على إحداث فشل يمكنه قراءة رسالة الخطأ الداخلية — عمليًا أسماء الفئات والحزم،
ومسارات الملفات، وأسماء المضيفين، وتفاصيل الاتصال المحمولة في رسائل الاستثناء (CWE-209). هذا هو عضو gRPC من
نفس عائلة استثناءات المستهلك غير المكتومة مثل تنبيهات knative وmina وCXF المنشورة إلى جانبه.
| بيئة التشغيل | الدليل | المكدس |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-grpc 4.22.0 (متأثر؛ مُصلح في 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.39.0 + camel-quarkus-grpc (Camel 4.22.0، متأثر؛ عنصر التحكم المُصلح CQ 3.40.0 / Camel 4.22.1) |
يُظهر كلا الوحدتين السلوك المتأثر و السلوك المُصلح مقابل مستهلك camel-grpc الحقيقي.
تشغّل كل وحدة مستهلك camel-grpc (خدمة PingPong من proto الاختبار الخاص بـ camel-grpc نفسه) يفشل مساره دائمًا
برسالة تبدو داخلية:
Internal failure contacting jdbc:postgresql://db.internal.local:5432 (user=svc_admin) [CVE-2026-85315]
نقطة نهاية المدقق /exploit/attack تلعب دور عميل gRPC خارجي: فهي تستدعي PingSyncSync، وتلتقط
StatusRuntimeException، وتُبلّغ عن رمز Status والوصف الذي أعاده الخادم.
muteException قيمته الافتراضية true، لذا يكون الوصف هو النص العام
"Exchange processing failed" ولا تغادر الرسالة الحقيقية الخادم أبدًا (فهي محفوظة فقط في سبب الحالة
المحلي).# 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"
كل وحدة تخدم المدقّق على 8080 وتشغّل مستهلك camel-grpc على 50051 داخل العملية نفسها؛ يُنشر المنفذ 8080 فقط.
| الخاصية | القيمة |
|---|---|
| المكوّن | camel-grpc (GrpcMethodHandler، المستهلك) |
| CWE | CWE-209 (توليد رسالة خطأ تحتوي على معلومات حساسة) |
| الخطورة | متوسطة |
| ناقل الهجوم | عميل gRPC خارجي يثير فشلًا في المسار ويقرأ وصف Status المُرسَل |
| التأثير | يُكشف للمتصل عن تفاصيل الخطأ الداخلية (أسماء الفئات/الحزم، المسارات، أسماء المضيفين، تفاصيل الاتصال) |
| الإصدارات المتأثرة | من 4.0.0 قبل 4.18.5، ومن 4.19.0 قبل 4.22.1 |
| الإصدارات المُصلحة | 4.18.5، 4.22.1، 4.23.0 |
| JIRA | CAMEL-24478 |
| الفضل | Claude Security Scan Tool |
الإشعار الأمني: https://camel.apache.org/security/CVE-2026-85315.html
وحدة Quarkus المتأثرة مبنية على CQ 3.39.0 (Camel 4.22.0). عنصر التحكم المُرقّع هو CQ 3.40.0 (Camel 4.22.1).
يضيف GrpcMethodHandler خيار مستهلك muteException (القيمة الافتراضية
true). عند تفعيله، يُنتج التبادل الفاشل الوصف العام "Exchange processing failed" في
الحالة المُرسَلة؛ ولا يزال استثناء المسار مرتبطًا محليًا عبر withCause(...)، وهو ما لا يرسله gRPC
إلى العميل. اضبط muteException=false على نقطة النهاية لاستعادة السلوك السابق.
اربط حالات الفشل بحالة صريحة في معالج onException حتى لا ينسخ الإطار أبدًا رسالة الاستثناء
إلى الوصف.
يُنشر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم
الثغرة، والتحقق مما إذا كانوا متأثرين بها، وتأكيد أن الترقية تحلّها. رسالة "الداخلية" هي
عنصر نائب غير ضار (db.internal.local، svc_admin) والعرض التوضيحي بأكمله يعمل في عملية واحدة. لا تستخدم هذه
المواد ضد أنظمة لا تملكها أو لا تديرها.