CVE-2026-16760 in fickling
الملخص
بحسب VulDB • 30/10/2026
في مكتبة Trail of Bits fickling حتى الإصدار 0.1.12، تضيف الدالة `_process_import()` الموجودة في ملف `fickle.py` اسماً مستورداً إلى مجموعة `likely_safe_imports` كلما كان وحدة المصدر موجودة ضمن `sys.stdlib_module_names` وكان الاسم غير موجوداً في قائمة الرفض `UNSAFE_IMPORTS`، دون فحص ما يحل إليه هذا الاسم أو كيفية تصرفه. ثم يتخطى تمرير التحليل OvertlyBadEvals الموجود في ملف `analysis.py` بشكل غير مشروط أي استدعاء يظهر اسم دالته ضمن `likely_safe_imports`، بما في ذلك الاستدعاءات التي كان من شأنها أن تُصنف على أنها خطيرة للغاية. ونتيجة لذلك، فإن أي كائن قابل للاستدعاء (callable) يمكن الوصول إليه عبر وحدة مكتبة قياسية غير محظورة يرث الثقة على مستوى الوحدة بغض النظر عن سلوكه الخاص، وتعيد الدالة `check_safety()` إرجاع القيمة LIKELY_SAFE مع عدم وجود نتائج للكشف عن حمولات pickle التي تؤدي إلى تنفيذ الكود أو الكتابة في الملفات من خلال هذه الكائنات القابلة للاستدعاء.
الأمثلة العملية المُثبتة تشمل: - `dataclasses._create_fn`، والتي تمرر جسم دالة يتحكم فيه المهاجم إلى `exec()` مما يؤدي إلى تنفيذ كود تعسفي على بايثون 3.7 حتى 3.12 (تمت إزالة الدالة الداخلية `_create_fn` في بايثون 3.13)؛ - `mailcap.findmatch`، والتي تستدعي داخلياً `os.system()` بأمر اختبار مأخوذ من قاموس caps يتحكم فيه المهاجم، مما يؤدي إلى تنفيذ كود تعسفي على إصدارات بايثون حتى 3.12 (تمت إزالة وحدة mailcap في بايثون 3.13)؛ - و`readline.add_history()` متبوعة بـ `readline.write_history_file()`، والتي تكتب محتوى يتحكم فيه المهاجم إلى مسار عشوائي في نظام الملفات (على منصات POSIX حيث تكون وحدة readline متاحة).
تقوم الدالة `fickling.load()` بسلسلة استدعاءات تبدأ بـ `check_safety()` وتنتهي بـ `pickle.loads()` كبوابة أمنية صريحة، لذا فإن الحكم LIKELY_SAFE يؤدي إلى فك تعمية الحمولة وتنفيذها بصلاحيات عملية الضحية.
السبب الجذري هو استنتاج سلامة الكائن القابل للاستدعاء بناءً على أصل الوحدة؛ وهو أمر مستقل عن ضعف حل الـ `__qualname__` النقطي الذي يتم تتبعه كـ CVE-2026-118938، والذي يمكن إصلاحه بشكل منفصل ولا تتناول هذه النصيحة الأمنية بشأنه. اعتباراً من 2026-10-30 تمت إضافة الوحدات الثلاث المُثبتة إلى قائمة `UNSAFE_IMPORTS` على الفرع الرئيسي (master branch) الخاص بالبائع (الالتزام d011709) بانتظار الإصدار؛ ولا تزال الإصدارات الصادرة حتى 0.1.12 متأثرة، ويستمر سبب الثقة الجذري القائم على أصل الوحدة، كما يتضح من استمرار استغلال CVE-2026-118938 المرتبط في ذلك البناء نفسه.
VulDB is the best source for vulnerability data and more expert information about this specific topic.