
إثبات مفهوم لـ CVE-2025-64512 باستخدام ملف متعدد الصيغ.
في الأسابيع الماضية (في نوفمبر 2025)، تم الكشف عن ثغرة مثيرة للاهتمام (CVE-2025-64512) في pdfminer.six, وهو مشروع Python شهير لمعالجة ملفات PDF، يُستخدم بشكل خاص في خطوط معالجة الذكاء الاصطناعي. تتيح الثغرة تنفيذ تعليمات برمجية عن بُعد عن طريق إلغاء تسلسل بيانات غير موثوقة عبر pickle.loads()، باستخدام ملف PDF كناقل هجوم. حتى الآن، كل شيء جيد: إنها ثغرة مهمة في حزمة Python شائعة. ما لفت انتباهي هو قابلية الاستغلال 👀.
على الأنظمة الشبيهة بلينكس، يمكن فقط حل الملفات الموجودة على نظام الملفات. سيحتاج المهاجم إلى تقديم ملف PDF الخبيث للمعالجة، ويجب أن يكون ملف pickle الخبيث موجودًا على النظام المستهدف في موقع يعرفه المهاجم مسبقًا، حيث يجب تعيينه داخل ملف PDF نفسه. في كثير من الحالات، سيكون من الصعب استغلال ذلك لأنه حتى لو قدم المهاجم ملفي PDF و pickle معًا، فلن تكون هناك طريقة لمعرفة المسار الكامل لملف pickle مسبقًا. [...] بشكل عام، هناك خطر أقل على نظام لينكس أو نظام شبيه بلينكس.
إذًا، على ما يبدو، لاستغلال هذه الثغرة على نظام شبيه بلينكس، يجب على المهاجم:
هل يمكننا إنشاء ملف PDF صالح يثير الثغرة دون معرفة مسار ملف pickle الخبيث؟
تعني كلمة «صالح» أن pdfminer.six لا يرفض الملف ويبدأ في معالجته (لأن ملف PDF هو ما يفتحه قارئ PDF).
الإجابة هي نعم، من خلال إنشاء حمولة متعددة اللغات (نوعًا ما). الفكرة هي إنشاء ملف يكون في الوقت نفسه ملف pickle.gz صالحًا وملف PDF صالحًا، بحيث يمكن لـ pdf2txt.py البدء في معالجة ملف PDF ثم الإشارة إليه لتحميل كود pickle بصيغة GZIP.
غالبًا - وليس دائمًا 🥲 - يكون الملف ملف PDF إذا احتوى على %PDF- في مكان ما، عمومًا في أول 1024 بايت (1 - 2). بالنسبة لـ pdfminer.six، يجب أن يحتوي ملف PDF الصالح فقط على كائن /Root (pdfdocument.py#L752).
ملف GZIP له بايتات أولية محددة (RFC 1952 - Sec. 2.3.1)، لكنه يدعم التعليقات (FCOMMENT، RFC 1952 - Sec. 2.3.1).
إذًا، هذا هو تصميم الملف متعدد اللغات: إنشاء GZIP صالح يحتوي على حمولة pickle الخبيثة، ودمج ملف PDF صالح داخل علامة GZIP FCOMMENT. ثم استخدم هذا الملف كملف PDF صالح مع pdf2txt.py لإثارة الثغرة، واستخدم الملف نفسه لتنفيذ الـ pickle الخبيث.
(2025.12.12) تعديل:
القيود الوحيد الذي لدينا هو اسم الملف: يجب أن ينتهي بـ .pickle.gz (وهذا مضمّن في كود .pdfminer.six، cmapdb.py#L235)
القيودان اللذان لدينا هما:
pdfminer.six، cmapdb.py#L235)؛أنا مندهش قليلًا من أن هذه الثغرة (CVE) يُقلَّل من شأنها، بالنظر إلى شعبية هذا المشروع (6k ⭐️ على GitHub، لكنه مستخدم من 34k مشروعًا، وفقًا لإحصائيات GitHub) وحالات الاستخدام (أدوات سطر الأوامر، سير عمل الذكاء الاصطناعي، خطوط المعالجة، باختصار، كل أنواع البنية التحتية التي لا تريد تحديثها إذا كانت تعمل بشكل جيد).
على سبيل المثال، أداة Microsoft markitdown 0.1.3 (microsoft/markitdown، 84k ⭐️ على GitHub ويستخدمها 2k مشروع)، المثبتة قبل 1 ديسمبر، معرضة لتنفيذ تعليمات برمجية عشوائية عبر pdfminer.six. أصدر فريق Microsoft تصحيحًا في 1 ديسمبر، 0.1.4، لكن دون تنبيهات أمنية، لذا لا أعتقد أن فرق الهندسة الأخرى أولت التحديث أولوية.
مشاريع أخرى قد تتأثر بـ CVE-2025-64512، ومن السهل جدًا استغلالها.
قائمة (غير مكتملة) بالمشاريع المعرضة للخطر:
docker build -t cve-2025-64512-poc .
docker run --rm -it cve-2025-64512-poc
pdf2txt.py payload.pickle.gz
docker build -t cve-2025-64512-poc .
docker run --rm -it cve-2025-64512-poc
markitdown markitdown-payload.pickle.gz -x pdf -o output.md
