Stanza 1.14.0 يعيد فتح ثغرة تنفيذ تعليمات برمجية عبر pickle لا يستطيع weights_only=True منعها
الترقية إلى ما بعد Stanza 1.12.2 أغلقت مسارًا واحدًا لتنفيذ التعليمات البرمجية عبر pickle، لكن 1.14.0 أضاف مسارًا ثانيًا في lemmatizer لا يراه weights_only=True، ويُصلحه الإصدار 1.15.0.
تحليل هندسي آلي من مكتب خالد أبوبكر الهندسي، مبني على المصادر الأولية المذكورة أدناه. لم يراجعه شخص قبل النشر. عن المكتب
الخلاصة
صدر تصحيح لكلتا ثغرتي تنفيذ التعليمات البرمجية عبر pickle في Stanza: CVE-2026-54499 في 1.12.2 وCVE-2026-115878 في 1.15.0. الفرق التي رقّت إلى 1.12.2 ثم انتقلت إلى 1.14.0 عادت معرّضة للخطر إذا كانت شيفرتها تحمّل checkpoint خاصًا بـ lemmatizer من مسار يمكن أن يتحكم فيه مستدعٍ أو مخزن مشترك أو سجل نماذج مخصص. رقِّ إلى 1.15.0 وتعامل مع كل ملف نموذج لـ Stanza على أنه شيفرة قابلة للتنفيذ.
ماذا حدث
في Stanza، مكتبة Python للمعالجة اللغوية الطبيعية من Stanford NLP، ثغرتان منفصلتان في إلغاء التسلسل تؤدي كلتاهما إلى تنفيذ تعليمات برمجية عشوائية عند تحميل ملف نموذج .pt خبيث.
CVE-2026-54499 / GHSA-v5jw-96jm-7h2c. قبل 1.12.2، كانت أدوات التحميل في Stanza مثل Pretrain.load() تحاول torch.load(..., weights_only=True)، وعند حدوث pickle.UnpicklingError يمكن للمهاجم تحفيزه، تعيد تحميل الملف نفسه باستخدام weights_only=False (NVD). وتشير النشرة الأمنية أيضًا إلى أن أداة تحميل lemma classifier كانت تستدعي torch.load دون الوسيط weights_only، وقيمته الافتراضية False في إصدارات PyTorch الأقدم من 2.6 (النشرة الأمنية). الإصدارات المتأثرة: 1.12.1 وما قبله. الإصدار المُصحِّح: 1.12.2، الذي يفرض weights_only=True في جميع أدوات تحميل النماذج ويجعل النماذج القديمة التي لا يمكن تحميلها بأمان تُطلق استثناءً (ملاحظات الإصدار). الدرجة الأساسية في CVSS 3.1 هي 7.5 (AV:N/AC:H/PR:N/UI:R).
CVE-2026-115878 / GHSA-gh9r-c94j-cmp5. منذ 1.14.0، يخزّن lemmatizer الحقل pos_dict على هيئة pickle مضغوط بـ gzip داخل ملف checkpoint (النشرة الأمنية). يستخدم استدعاء torch.load الخارجي weights_only=True، لكن البايتات المتداخلة تُعامَل كقيمة بدائية ولا تفحصها قائمة السماح الخاصة به أبدًا؛ ثم يُمرَّر التدفق بعد فك ضغطه إلى pickle.loads غير مقيّد (NVD). يحدث التنفيذ أثناء بناء الـ pipeline عبر lemma_model_path يمكن للمستدعي التأثير فيه، قبل معالجة أي مدخلات للاستدلال. وتنص النشرة صراحةً على أن هذا ليس مسار الرجوع الذي أُصلح ضمن CVE-2026-54499. الإصدار المُصحِّح: 1.15.0. الدرجة الأساسية في CVSS 3.1 هي 7.8 (AV:L/AC:L/PR:N/UI:R).
لماذا يهم
المعالجة الشائعة لمخاطر pickle في PyTorch تتلخص في عبارة "حمِّل باستخدام weights_only=True". وهذا بالضبط ما فعله Stanza 1.12.2، ومن المرجح أن كثيرًا من الفرق أغلقت CVE-2026-54499 على هذا الأساس. يُظهر CVE-2026-115878 أن هذا الخيار لا يحمي سوى تدفق pickle الخارجي. فأي مكتبة تضمّن بايتات مُسلسَلة داخل checkpoint ثم تُلغي تسلسلها بنفسها تكون قد خرجت من نطاق تلك الحماية، ويمنح الخيار حينها شعورًا زائفًا بالأمان.
المتأثرون عمليًا: الخدمات ودفاتر notebooks ومهام CI وعُقد التدريب التي تبني pipeline في Stanza بمسار نموذج lemmatizer لا تتحكم فيه بالكامل، أو التي تسحب نماذج lemma من ذاكرات تخزين مؤقت مشتركة أو مخازن artefacts أو سجلات نماذج مخصصة. وتشير النشرة إلى أن التحقق عبر MD5 موجود فقط في مسار التنزيل الافتراضي من السجل؛ أما المسارات التي يمررها المستدعي فلا تخضع لأي checksum. والـ pipeline الذي يستخدم النماذج القياسية فقط المُنزَّلة عبر المسار الافتراضي أقل تعرضًا بكثير للثغرة الثانية.
تختلف متجهات CVSS (شبكي/تعقيد مرتفع للأولى، محلي/تعقيد منخفض للثانية)، لكن كلتيهما تتطلب وصول ملف خبيث إلى أداة التحميل. لا تفهم المتجه "Local" على أنه "خطر منخفض": ففي خدمة معالجة لغوية، مسار النموذج الآتي من الإعدادات أو من إعداد خاص بمستأجر أو من bucket مشترك هو سطح الهجوم نفسه.
التقييم الهندسي
تقييمنا: هذه ترقية عالية الأولوية لكنها محدودة النطاق. السؤال الحقيقي ليس "أي إصدار من Stanza" وحده، بل "من يستطيع الكتابة إلى ملفات النماذج التي تحمّلها عمليتنا أو اختيارها". إذا كان الجواب "خط البناء لدينا فقط، ومن السجل الافتراضي"، فدرجة التعرض لـ CVE-2026-115878 محدودة. أما إذا كانت مسارات النماذج قابلة للضبط لكل مستأجر، أو تُزامَن من تخزين مشترك، أو تُجلب من منصات طرف ثالث، فتعامل معها على أنها تنفيذ تعليمات برمجية عن بُعد داخل العملية التي تبني الـ pipeline، وبصلاحيات تلك العملية.
ثلاث نقاط تقلل الإعلانات من شأنها:
- "ما بعد 1.12.2" ليس خط أساس أمنيًا. جاء التراجع الأمني في إصدار ميزات لاحق. ينبغي أن تكون قيود الإصدارات في سياسات الاعتماديات مرتبطة بكل نشرة أمنية على حدة، لا بقاعدة "أحدث من آخر تصحيح".
- التنفيذ يحدث عند البناء لا عند الاستدلال. تنقية المدخلات أو التحقق من الطلبات أو وضع WAF أمام نقطة النهاية الخاصة بالمعالجة اللغوية لا يفيد هنا شيئًا. المحفّز هو تحميل النموذج، الذي يجري غالبًا عند بدء تشغيل الحاوية مع صلاحيات بيئة واسعة.
- الحل البديل المؤقت للنماذج القديمة يعيد الثغرة الأولى. نصيحة المورّد للـ checkpoints التي يفشل تحميلها على 1.12.2 وما بعده هي تحميلها وإعادة حفظها بإصدار أقدم مثل 1.12.1، الذي لا يزال يحتوي مسار الرجوع غير الآمن. هذا مقبول فقط للملفات الموثوق مصدرها أصلًا، وينبغي تنفيذه في بيئة مؤقتة تُتلف بعد الاستخدام.
مخاطر التوافق في 1.15.0 غير موثقة في الأدلة المتاحة. تقترح النشرة تقييد أداة إلغاء التسلسل الداخلية بالحاويات البسيطة، وبموجب ذلك يظل pos_dict المشروع (وهو تعيين نصي) قابلًا للتحميل، لكن الأدلة لا تؤكد ما يفعله التصحيح المنشور فعليًا، ولا ما إذا كانت checkpoints الخاصة بـ lemma المُنشأة في 1.14.0 تحتاج إلى إعادة توليد. خصّص وقتًا لاختبار انحدار لتحميل النماذج بدل افتراض ترقية بلا أي تعديل.
الدرس الأوسع للفرق التي تبني تطبيقات الذكاء الاصطناعي: أي artefact لنموذج بصيغة قائمة على pickle هو شيفرة. يقلّص weights_only=True الخطر الخارجي، لكنه لا يجعل تحميل ملف من مصدر غير موثوق آمنًا.
هل يعنيك هذا؟
stanza1.14.0 مثبّت (تصف NVD وOSV النطاق بأنه من 1.14.0 حتى 1.15.0؛ أما النشرة على GitHub فتذكر 1.14.0 فقط).stanza1.12.1 أو ما قبله مثبّت (CVE-2026-54499).- شيفرتك تمرر
lemma_model_pathإلىstanza.Pipeline، لا سيما من الإعدادات أو مدخلات المستخدم أو إعدادات المستأجرين. - تُقرأ نماذج Stanza من تخزين شبكي مشترك أو تخزين كائنات أو مخزن artefacts أو سجل نماذج مخصص أو منصة طرف ثالث بدل مسار التنزيل الافتراضي.
- على Stanza 1.12.1 أو ما قبله مع PyTorch أقدم من 2.6، يُحمَّل lemma classifier دون
weights_onlyإطلاقًا. - العملية التي تبني الـ pipeline تحمل صلاحيات للسحابة أو لقواعد البيانات أو لسجلات النماذج.
ما الذي ينبغي فعله
- أجرِ الجرد الآن. افحص كل بيئة وكل صورة حاوية وكل lockfile:
pip show stanza python -c "import stanza; print(stanza.__version__)" pip show torch - رقِّ إلى 1.15.0. إنه أول إصدار يحمل تصحيحًا لـ CVE-2026-115878، وهو أعلى من الإصدار المُصحِّح 1.12.2 لـ CVE-2026-54499:
ثبّت الإصدار في ملفات requirements أو lockfiles وأعد بناء صور الحاويات؛ لا تعتمد على قيد إصدار مرن.pip install --upgrade "stanza>=1.15.0" - اختبر تحميل النماذج قبل النشر. ابنِ كل pipeline إنتاجي (بما في ذلك نماذج lemma وpretrain وclassifier المخصصة) على 1.15.0 في بيئة staging. منذ 1.12.2، تُطلق الـ checkpoints القديمة التي لا يمكن تحميلها بأمان استثناءً.
- تعامل مع الـ checkpoints القديمة بحذر. توجيه المورّد هو تحميل النماذج التي يفشل تحميلها وإعادة حفظها بإصدار أقدم مثل 1.12.1. افعل ذلك فقط للملفات ذات المصدر الموثوق، وفي بيئة معزولة خالية من أي صلاحيات (العزل ليس من توجيهات المورّد).
- إلى حين الترقية، أغلق المسار. ليس من توجيهات المورّد: توقّف عن قبول قيم
lemma_model_pathمن المستخدمين أو المستأجرين، وقيّد صلاحيات الكتابة على مجلدات النماذج والـ buckets، وثبّت قيم hash خاصة بك لكل ملف نموذج مخصص، لأن المسارات التي يمررها المستدعي لا تخضع لأي checksum. - قلّص نطاق الضرر. ليس من توجيهات المورّد: ابنِ الـ pipelines في عملية لا تحتوي بيئتها على مفاتيح سحابية طويلة الأمد، وتعامل مع العمليات التي تحمّل النماذج على أنها مشغّلات لشيفرة غير موثوقة.
- للقادة التقنيين. ليس من توجيهات المورّد: راجع شيفرتكم بحثًا عن أي
pickle.loadsيُطبَّق على بايتات مستخرجة من checkpoint؛ فالتجاوز نفسه لـweights_only=Trueينطبق على أدوات التحميل الداخلية. تابع أخبار Engineering Desk للاطلاع على المستجدات.
ما لا نعرفه بعد
- ما إذا كان هناك أي إصدار 1.14.x غير 1.14.0 وما إذا كان متأثرًا؛ إذ تصف النشرة على GitHub وNVD النطاق بشكل مختلف.
- ما إذا كان تصحيح 1.15.0 يغيّر طريقة تحميل checkpoints الخاصة بـ lemma المُنشأة في 1.14.0، أو ما إذا كانت تحتاج إلى إعادة توليد.
- ما إذا كانت أدوات تحميل أخرى في 1.15.0 تُلغي تسلسل بايتات متداخلة أو قيم غير tensor خارج قائمة السماح الخاصة بـ
weights_only=True. - كيف تنعكس متجهات CVSS المختلفة (شبكي/تعقيد مرتفع مقابل محلي/تعقيد منخفض) على درجة التعرض الفعلية؛ ورأي الـ Desk أن نموذج النشر أهم من أي من الدرجتين.
سيراجع الـ Desk ملاحظات إصدار 1.15.0 وcommit التصحيح بحثًا عن تفاصيل التوافق مع الـ checkpoints، وعن أي نشرات أمنية إضافية تخص أدوات التحميل في Stanza.
المصادر
أحدث التحليلات الهندسية
الممارسة الهندسيةقراءة 1 دقيقة
Laravel 13.40.0: تغييرات في المعاملات والنسخ المتماثلة وRedis ينبغي اختبارها أولًا
إصدار فرعي يغيّر سلوك تطبيقات Laravel كثيفة الاعتماد على قواعد البيانات عند الأعطال، إضافةً إلى إصلاح ذي طابع أمني في Concurrency صدر دون أي نشرة أمنية.
قراءة 2 دقيقة
مكتبات SD-JWT لـ JavaScript تُسقط الإفصاحات المُعدَّلة بصمت وتُبلغ بالنجاح (CVE-2026-62374)
فجوة في المطابقة للمواصفة من جهة المُتحقِّق في مكتبات SD-JWT لـ JavaScript التابعة لـ OpenWallet Foundation تتيح لحامل بيانات الاعتماد حذف مطالبة (claim) بصمت، ولا يمنع ربط المفتاح ذلك.
قراءة 2 دقيقة
ثغرة CVE-2026-119084 في Amazon Redshift JDBC Driver: تحميل غير آمن للأصناف، والتصحيح في الإصدار 2.3.0
أصلحت AWS ثغرة انعكاس غير آمن (unsafe reflection) في Amazon Redshift JDBC Driver ضمن الإصدار 2.3.0. لكن درجة التعرض تتوقف على من يتحكم في سلاسل الاتصال لديك، وعلى ما يوجد في مسار الأصناف (classpath).