يسجل CVE نُشر يوم الاثنين أن حزم Flair الرسمية للإصدارين 0.15.0 و0.15.1 لا تزال تتضمن flair/models/clustering.py، حيث تُعيد مسار تحميل النموذج pickle.loads(joblib.load(...)). وهذا هو نفس الـ sink، وفي الملف نفسه، كما في CVE من عام 2024 — الذي يذكر 0.15.0 بوصفه الإصدار المُصلَح.
ما الذي كان يعنيه "مُصلَح"
تم إلغاء دعم ميزة clustering في 0.15.0 — من واجهة برمجة التطبيقات الموثقة. ولم تُحذف من الحزمة الموزعة. فما زالت الوحدة موجودة في wheel ويمكن الوصول إليها عبر الاستيراد المباشر لـ flair.models.clustering. ويقول التحذير الجديد ذلك بوضوح: "لا ينطبق الإصدار المُصلَح في السجل السابق على الحزمة المشحونة."
ما الذي تسيء الصياغة التقليدية فهمه
المأزق هنا ليس في الشفرة، بل في البيانات الوصفية. فعبارة "fixed in 0.15.0" في سجل CVE فُهمت على أنها تعني أن الشفرة غادرت الحزمة؛ لكنها كانت تعني أن المشرفين توقفوا عن دعم الميزة. وأي جهة يستخدم برنامجها ماسح تحليل مكونات البرمجيات ويقرأ حقل الإصدار المُصلَح في سجل 2024 سيضع تثبيت 0.15.1 على أنه نظيف. لكنه ليس نظيفًا. وسوء القراءة الثاني يذهب في الاتجاه المعاكس، نحو إثارة الذعر: فالدرجات هي 8.4 و7.8 HIGH لكن المتجه محلي — AV:L مع اشتراط تفاعل المستخدم. وعلى الضحية أن يحمّل ملف نموذج يوفره المهاجم. هذه مشكلة سلسلة توريد خاصة بوزنات غير موثوقة، لا RCE عبر الشبكة، والإبلاغ عن 8.4 من دون المتجه يبالغ فيها بشكل كبير. كلا الدرجتين ثانويتان؛ ولم تنشر NVD أي CVSS أولي.
التواريخ التي تجعل الأمر أسوأ
تم رفع 0.15.0 من Flair إلى PyPI في 20 ديسمبر 2024. وجاءت 0.15.1 في 5 فبراير 2025 وظلت الإصدار الحالي منذ ذلك الحين — أي نحو 18 شهرًا ظل خلالها الملف موجودًا، وكانت الميزة غير موثقة، وكانت بيانات النظام البيئي الوصفية تقول إن المشكلة حُلّت. ولا يوجد إصدار مُصلَح الآن أيضًا.
لماذا تتكرر هذه الفئة
إن عبارة "حمّل ملف نموذج، وشغّل شيفرتهم" هي أقدم مخاطرة في منظومة تعلّم الآلة بلغة Python، ولا يزال pickle هو آلية التسلسل الافتراضية في كثير من هذه الحالات. وما يجعل هذه الحالة تعليمية هو أن الخلل يقع في حفظ السجلات لا في الشفرة: فتنبيه عمره عامان ترك sink حيًّا مَعلّمًا على أنه محلول، وصدّقت الأداة الآلية التي تعتمد عليها معظم المؤسسات ذلك.
