
مُعيد إنتاج قابل للتشغيل لـ Spring Boot من أجل CVE-2026-85246، يُوضّح كشف استثناء مستهلك camel-mina عبر المقبس ويتحقق من إصلاح muteException.
مُعيد إنتاج إثبات مفهوم قابل للتشغيل لثغرة Apache Camel حيث كتب مستهلك Mina
exchange.getException() مباشرةً فوق المقبس إلى النظير البعيد عند فشل معالجة تبادل (exchange).
عبر برنامج ترميز textline الذي يمنح النظير اسم صنف الاستثناء ورسالته؛ وعبر برنامج ترميز الكائنات يمنحه
الاستثناء المُسلسَل، بما في ذلك سلسلة الأسباب. كان بإمكان نظير بعيد قادر على إحداث فشل قراءة تفاصيل داخلية
حول النشر — أسماء الأصناف والحزم، وكل ما تحمله رسالة أو سبب متداخل، والذي يتضمن عمليًا مسارات وأسماء مضيفين
وتفاصيل اتصال. لم يكن لدى المستهلك خيار لكتم ذلك، على عكس مستهلكي عائلة HTTP الذين وُوفق بينهم عبر CAMEL-23651.
Spring Boot فقط. لا توجد إضافة
camel-quarkus-mina، لذا يشحن مُعيد الإنتاج هذا وحدة Camel Spring Boot واحدة. (الخلل فيMinaConsumerالخاص بالمكوّن، وهو مستقل عن بيئة التشغيل.)
| بيئة التشغيل | الدليل | الحزمة |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-mina 4.22.0 (متأثر؛ مُصلَح في 4.22.1) |
يعالج مستهلك Mina TCP (sync=true، textline=true) كل سطر وارد ويفشل — ليمثل أي مسار
يصطدم بخطأ داخلي. يرمي المسار IllegalStateException تحمل رسالته تفاصيل داخلية محاكاة
(مسار إعدادات وهمي /etc/camel/secret.properties، ومضيف وهمي، ورمز علامة). برنامج تشغيل الاستغلال هو
نظير TCP بعيد عادي: يفتح مقبسًا، ويرسل سطرًا واحدًا، ويقرأ الرد الذي يكتبه المستهلك مرة أخرى.
java.lang.IllegalStateException: INTERNAL-DETAIL-MARKER-7F3A2B config=/etc/camel/secret.properties db=internal-db.prod.svc.java.lang.Exception: Exchange processing failed عام — بلا صنف أو رسالة أو تتبّع
مكدس لاستثناء المسار — مع الاستمرار في الرد، حتى لا يُترك نظير متزامن حتى انتهاء المهلة.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: exception leaks over the socket; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85246-mina-info-disclosure-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: generic reply; >>> Not exploited
| الخاصية | القيمة |
|---|---|
| المكوّن | camel-mina (MinaConsumer.messageReceived) |
| CWE | CWE-209 (توليد رسالة خطأ تحتوي على معلومات حساسة) |
| الخطورة | متوسطة |
| ناقل الهجوم | يُثير نظير TCP/UDP بعيد فشلًا في المسار ويقرأ الاستثناء من الرد المكتوب مرة أخرى عبر المقبس |
| التأثير | الكشف عن المعلومات: فئة/رسالة الاستثناء عبر مرمّز textline، أو الاستثناء المُسلسَل + سلسلة السبب عبر مرمّز الكائنات (أسماء المضيفين الداخلية، المسارات، تفاصيل الاتصال) |
| الإصدارات المتأثرة | من 4.0.0 قبل 4.18.5، ومن 4.19.0 قبل 4.22.1 |
| الإصدارات المُصلَحة | 4.18.5، 4.22.1، 4.23.0 |
| JIRA | CAMEL-24476 |
| الفضل | Claude Security Scan Tool |
الإشعار الأمني: https://camel.apache.org/security/CVE-2026-85246.html
يضيف MinaConsumer خيارًا للمستهلك باسم muteException (القيمة الافتراضية true).
عند تفعيله، لم يعد التبادل الفاشل يكتب exchange.getException() مرة أخرى؛ بل يكتب بدلًا منه
Exception("Exchange processing failed") مع تتبّع مكدّس فارغ — لا يزال Exception (بحيث يتلقى نظير مرمّز الكائنات
واحدًا) لكنه لا يحمل أي فئة أو رسالة أو إطارات من استثناء المسار. لا يزال يُكتَب رد حتى لا يُترك النظير
المتزامن حتى انتهاء المهلة. اضبط muteException=false لاستعادة السلوك السابق.
أضف معالج onException يضبط جسم الرد صراحةً، بحيث لا يكتب الإطار العمل الاستثناء مرة أخرى إلى
النظير.
يُنشَر هذا المستودع لأغراض تعليمية ودفاعية: لمساعدة مستخدمي Apache Camel على فهم الثغرة الأمنية، والتحقق مما إذا كانوا متأثرين بها، وتأكيد أن الترقية تحلّها. مسار الإعداد والمضيف و الرمز المميّز في المسار الفاشل هي عناصر محلية ثابتة ومُختلَقة. لا تستخدم هذه المواد ضد أنظمة لا تملكها أو لا تديرها.