
PoC لـ Foxit Reader CVE-2018-14442
PDF هو تنسيق ملفات يُستخدم لتمثيل المستندات. يتكوّن ملف PDF من عدة كائنات بيانات
الكائنات الأولية البسيطة Integer، Number، Boolean، Null
الكائنات المعقدة
| التنسيق | الاسم |
|---|---|
| [.*] | Array |
| (.*) | String |
| <<.*>> | Dictionary |
| <.*> | Hex String |
| /.* | Name |
| stream.*endstream | Stream |
تحدد هذه الكائنات شكل ملف PDF وما يحتويه. توجد الهياكل في ملف PDF في نوعين من الكائنات - المباشرة وغير المباشرة. يبدأ الكائن غير المباشر برقم الكائن ورقم الجيل متبوعين بالكائن الفعلي. يمكن الإشارة إلى الكائنات غير المباشرة مباشرة في كائنات أخرى بصيغة n m R حيث يكون n و m هما رقما الكائن والجيل على الترتيب.
كائنات القواميس هي اللبنات الأساسية للمستند. هناك بعض كائنات القواميس العامة اللازمة لتشكيل الصفحة أو المستند نفسه. الأهم هو قاموس Root الذي يحدد الروابط إلى جميع Pages و Metadata و Names وغيرها، ويمكن أن يكون كل منها كائنًا آخر.
تحتوي كائنات التدفق على معظم البيانات الثنائية مثل الخطوط والصور أو البيانات المضغوطة/المشفرة.
يمكن تشفير مستند PDF لحماية محتوياته من الوصول غير المصرح به. ينطبق التشفير على جميع السلاسل والتدفقات في ملف PDF الخاص بالمستند، مع بعض الاستثناءات مثل قاموس Encrypt نفسه. ينطبق التشفير في معظمه على كائنات التدفق. لا يُطبَّق التشفير على أنواع الكائنات الأخرى مثل الأعداد الصحيحة والقيم المنطقية، والتي تُستخدم أساسًا لنقل معلومات حول بنية المستند وليس محتوياته.
يجب تخزين المعلومات المتعلقة بالتشفير في قاموس تشفير المستند، والذي يكون قيمة الإدخال "Encrypt" في قاموس التذييل الخاص بالمستند.
يقوم CPDF_Parser::StartParse بتعيين m_pCryptoHandler للكائنات غير المباشرة المشفرة في ملف PDF. يجب تصفير m_pCryptoHandler عند اكتمال CPDF_Parser::ReleaseEncryptHandler. بدلاً من ذلك، لا يزيل CPDF_Parser::ReleaseEncryptHandler المرجع إلى CryptoHandler في CPDF_Parser، ويظل المرجع معلقًا.
لاحقًا عندما يبدأ المحلِّل في تحليل الكائنات المُشار إليها في قاموس Root، يتم استدعاء m_pCryptoHandler+8 لفك تشفير البيانات.
تم إصلاح خطأ مشابه في pdfium في الالتزام 741c362fb75fd8acd2ed2059c6e3e716a63a7ac8. انظر https://bugs.chromium.org/p/chromium/issues/detail?id=726503
تسمح ملفات PDF بتضمين JS في المستند، ويمكن تنفيذه تلقائيًا إذا أُدخل في OpenAction لقاموس من نوع Catalog. بمجرد حصولنا على تنفيذ JS، يمكننا رش الكائنات في مساحة العملية للوصول إلى عنوان قابل للتنبؤ حيث سنكتب سلسلة ROP الخاصة بنا.
عند توقيع مستند PDF في Foxit Reader، يستخدم plugins\jrsys\x86\jrsysMSCryptoDll.dll من دليل التثبيت لقراءة معلومات التوقيع، الأمر الذي يحمّل jrsysCryptoDll.dll على عنوان ثابت هو 0x10000000. تستورد هذه الـ dll الدالة VirtualAlloc، مما يسهل تنفيذ الحمولة. يستخدم الاستغلال المرفق رش الكومة للحصول على تخطيط ذاكرة قابل للتنبؤ، ويستخدم سلسلة ROP لتخصيص صفحة RWX، ونسخ الحمولة وتنفيذها.
تم اختبار هذا الاستغلال باستخدام Foxit Reader 9.0.1.1049 x86 على نظام MS Windows 7 Enterprise Build 7601 SP1 x86. يتطلب الاستغلال أن تكون الكومة في حالة محددة، إذا فشل الاستغلال، يرجى المحاولة مرة أخرى. يرجى الرجوع إلى عرض الفيديو. هذه الثغرة موجودة أيضًا في Foxit PDF Reader وConverter لنظام Android.
bitcoins.pdf هو ملف PDF المصمَّع الذي يعيد تخصيص الذاكرة المحرَّرة ويستثير الخطأ الأساسي. إذا أردت إعادة إنتاج الانهيار في المصحح (debugger)، فيرجى تمكين Page Heaps لتطبيق FoxitReader.exe وفتح bitcoins.pdf.
تم العثور على هذا الانهيار بواسطة Cloudfuzz - منصة اختبار تشويش (fuzzing) تم تطويرها في Payatu. تم إجراء المزيد من التحليل والاستغلال بواسطة Sudhakar