
CVE-2026-4372: نموذج التهديد، تحليل السبب الجذري، الاستنساخ والكشف
تحليل دفاعي لثغرة حرجة في التنفيذ عن بُعد للشيفرة (RCE) في مكتبة Hugging Face
transformers.
| الحقل | القيمة |
|---|---|
| المعرّف | CVE-2026-4372 / GHSA-29pf-2h5f-8g72 |
| المكوّن | Hugging Face transformers |
| الفئة | التنفيذ عن بُعد للشيفرة (CWE-94، حقن الشيفرة) |
| نقطة الدخول | AutoModelForCausalLM.from_pretrained()، عند تحميل نموذج |
| الآلية | إعداد الانتباه في ملف config.json الخاص بالنموذج (attn_implementation / _attn_implementation_internal) يجعل المكتبة تُنزّل شيفرة المهاجم وتُشغّلها |
| الخاصية الرئيسية | تتجاوز trust_remote_code=False، وهو الإعداد الذي يعتمد عليه المستخدمون لمنع هذا بالضبط |
| تم إصلاحها في | transformers 5.3.0 |
المستخدم الذي ترك trust_remote_code=False عمداً ليبقى آمناً كان لا يزال معرّضاً للخطر.
تحقّق من التفاصيل أدناه مقابل المصادر الرسمية قبل اعتبارها نهائية:
هناك وصفان للمُحرّض متداولان:
config.json (_attn_implementation_internal).kernels، التي غالباً ما تُثبَّت عبر transformers[all].من المرجّح أنهما المسار نفسه: حقل الانتباه يسمّي مستودعاً على Hub، وحزمة
kernels تُنزّل الشيفرة منه وتُشغّلها. اعتبر أسماء الحقول هنا
مؤقتة حتى يؤكدها التزام الإصلاح.
[ Model repo on the Hub ] untrusted source
│ config.json, tokenizer, weights, (code)
▼
[ Download to local cache ]
▼
[ Read config.json ] settings become a config object
▼
[ Pick model class + attention type ]
▼
[ Build model, load weights ]
▼
[ Model runs in the user's process, with the user's permissions ]
| # | الحد | الحماية التي ينبغي أن تُطبَّق |
|---|---|---|
| TB-1 | Hub ← القرص المحلي | مستودعات موثوقة، وتثبيت على commit محدد |
| TB-2 | ملف الإعدادات ← كائن الإعدادات | السماح فقط بالقيم المعروفة والآمنة |
| TB-3 | كائن الإعدادات ← الكود قيد التشغيل | trust_remote_code |
| TB-4 | النموذج ← نظام التشغيل | صندوق عزل (sandbox)، أقل صلاحية ممكنة |
الخلل هو إخفاق عند TB-3: وصلت قيمة من ملف الإعدادات إلى تنفيذ الكود
دون المرور بفحص trust_remote_code.
في كل الحالات لا يشغّل الضحية سوى الاستدعاء العادي،
AutoModelForCausalLM.from_pretrained("<repo-id>").
يحمي trust_remote_code طريقة واحدة لتشغيل كود المستودع: ملفات modeling_*.py المخصصة.
أما إعداد الانتباه فكان طريقة ثانية لم تمر قط عبر تلك الحماية.
untrusted config.json attention setting
│
▼
"pick attention type" logic
│ never checks:
✗ ─────────────▶ trust_remote_code
▼
download + run code from the Hub (via `kernels`)
_) من ملف غير موثوق.kernels) مكّنت الهجوم بصمت عند تثبيتها، على سبيل المثال عبر transformers[all].احمِ الإجراء الخطير، لا مسارًا واحدًا إليه. يجب أن يمر كل مسار يمكن أن يؤدي إلى "تنفيذ شيفرة" عبر الفحص نفسه.
الدفاع هو سكربت واحد مكتفٍ ذاتيًا، defence/safe_load.py.
تحل دالته safe_from_pretrained() محل from_pretrained() وتنفذ أربعة فحوص
قبل تحميل أي نموذج. إذا فشل أحدها، فإنه يرفع UnsafeModelLoad ولا يُحمَّل أي شيء.
| # | الفحص | ما الذي يفعله |
|---|---|---|
| 1 | الإصدار | يرفض إذا كان transformers أقدم من 5.3.0. هذا هو الإصلاح الحقيقي. |
| 2 | Kernels | على إصدار قديم، يرفض إذا كانت حزمة kernels مثبتة، لأن الهجوم يحتاجها. |
| 3 | الإعداد | يقرأ ملفات إعداد النموذج ويرفض إذا كانت تحتوي على إعداد خطير (انظر أدناه). تُفحص نماذج Hub وتُحمَّل عند الـ commit نفسه. |
| 4 | الشيفرة البعيدة | يعيّن دائمًا trust_remote_code=False. ممارسة جيدة فقط: هذه الثغرة تتجاوزها. |
يُرفض الإصدار القديم عند الفحص 1. لا يُنفَّذ الفحصان 2 و3 على إصدار قديم إلا إذا
عُيّن الخيار المخصص للمختبر فقط allow_vulnerable_env=True.
ما الذي يحجبه الفحص 3:
attn_implementation، _attn_implementation،
_attn_implementation_internal) غير مدمج. يُسمح فقط بـ eager، sdpa،
flash_attention_2، flash_attention_3 وflex_attention، لذا تُحجب قيمة
مثل attacker-org/evil-kernel، حتى داخل إعداد فرعي متداخل._attn_implementation_internal، auto_map وcustom_pipelines.config=، لأنه سيتجاوز الفحص.بالنسبة لنماذج Hub، تُنزَّل ملفات الإعداد فقط، وليس الأوزان أو الشيفرة أبدًا. تُنزَّل
عند commit ثابت واحد، ثم يُحمَّل النموذج من الـ commit نفسه،
لذا لا يمكن استبدال الملفات بين الفحص والتحميل. بعد مراجعة
التحذيرات، يمكن لشخص تجاوز الفحص 3 عبر accept_findings=True.
| الحالة | ما الذي يوقف الهجوم |
|---|---|
transformers 5.3.0 أو أحدث | الفحص 1 |
إصدار قديم، kernels مثبتة | الفحص 2 |
| إصدار قديم، إعداد خطير في الإعداد | الفحص 3 |
| تغيّر المستودع بعد فحصه | الفحص 3 (نفس الـ commit يُفحص ويُحمَّل) |
القيد: يعرف الفحص 3 فقط الإعدادات المذكورة أعلاه، لذا لا يمكنه اكتشاف هجوم
جديد. الترقية إلى transformers>=5.3.0 هي الإصلاح الكامل الوحيد.
يكشف مكوّن الكشف عن إعدادات نماذج Hugging Face التي قد تكون غير آمنة والاعتماديات المعرضة للخطر المرتبطة بـ CVE-2026-4372. يوفر آليتي كشف مستقلتين: الفحص الساكن للإعداد وتحليل الاعتماديات.
على عكس مكوّن الدفاع، تُبلّغ هذه الأدوات عن مخاطر أمنية محتملة دون تحميل نماذج أو تنفيذ شيفرة غير موثوقة.
الملف: src/detection/static_detector.py
يحلّل الكاشف الساكن ملفات config.json ويفحص بشكل تكراري كائنات JSON المتداخلة
والمصفوفات بحثًا عن الحقول الحساسة أمنيًا.
تُراقَب الحقول التالية:
| حقل الإعداد | غرض الكشف |
|---|---|
_attn_implementation_internal | حقل إعداد الانتباه الداخلي المرتبط بـ CVE-2026-4372 |
_experts_implementation_internal | حقل تنفيذ داخلي إضافي يتطلب المراجعة |
auto_map | قد يشير إلى شيفرة تنفيذ نموذج مخصصة |
custom_pipelines | قد يشير إلى تنفيذات pipeline مخصصة |
الاستخدام:
cd src/detection
python3 static_detector.py samples/suspicious_config.json
مثال على المخرجات:
[WARNING] samples/suspicious_config.json: review field '_attn_implementation_internal'
رموز الخروج:
| رمز الخروج | المعنى |
|---|---|
0 | PASS — لم يتم اكتشاف أي حقول مراقبة |
1 | WARNING — تم اكتشاف حقل مراقب واحد أو أكثر |
2 | ERROR — JSON غير صالح، أو ملف مفقود، أو خطأ في المعالجة |
وجود حقل مراقب لا يشير بالضرورة إلى استغلال. تتطلب النتائج مزيدًا من التحقيق.
الملف: src/detection/dependency_detector.py
يفحص كاشف التبعيات بيئة Python لتحديد ما يلي:
kernels المثبّتة، إن كانت متاحةkernels الاختيارية قابلة للاستيرادالاستخدام: