
أداة بايثون لاكتشاف ملفات PDF التي تستغل CVE-2026-86950
لمزيد من السياق حول هذا المشروع وثغرة CVE-2026-86950، راجع https://decalage.info/CVE-2026-86950/
إخلاء المسؤولية: كُتب معظم هذا الملف التعريفي وكود الكشف بمساعدة وكلاء برمجة بالذكاء الاصطناعي. وقد اختُبرت الأداة بنجاح على آلاف ملفات PDF الشرعية وعلى إثبات المفهوم المتاح المنشور هنا. ومع ذلك، فإن هذه الأداة جديدة وخوارزمية الكشف معقدة نوعًا ما لذا استخدمها بحذر.
يقوم detect_cve_2026_86950.py بفحص ملفات PDF فحصًا ساكنًا بحثًا عن خطوط مضمّنة
مصممة لاستغلال CVE-2026-86950 ("The Great Glyph Grift")، وهو
كتابة خارج الحدود في مُنقّط الحروف (glyph rasterizer) المضاد للتعرّج (anti-aliased) في Apple CoreGraphics
(تم إصلاحه في iOS / macOS 26.7.1).
لا يقوم أبدًا بعرض الخط أو تنفيذ أي كود استغلال — بل يحلّل ملف PDF وبرنامج الخط المضمّن ويبحث عن البصمة البنيوية للهجوم.
يحوّل CoreGraphics إحداثيًا عشريًا للجهاز إلى عدد صحيح بنقطة ثابتة 16.12 بتقريبًا:
int32_t aa_double_to_fixed(double px) { return (int32_t)(0.5 + 4096.0 * px); }
عندما يتجاوز 4096 * px نطاق int32، يصبح التحويل سلوكًا غير معرّف،
وتختلف موضعا الاستدعاء (aa_moveto مقابل aa_lineto) — أحدهما يُشبِع والآخر
يقتطع. هذا الاختلاف يُفسد حساب الصندوق المحيط للـ glyph في
aa_add_edges، لذا يُخصَّص مخزن التغطية في aa_cache_render أصغر من اللازم
فيكتب المُنقّط خارج الحدود. تُضيف رقعة 26.7.1 تقييدًا صريحًا إلى ±0x3FFFF001.
يبني إثبات المفهوم العام خطًا TrueType خبيثًا يفرض إحداثيًا مفرط الحجم كهذا:
/Tf 1024)، يفيض 4096 × device_coord عن int32./FontFile2) وCFF / OpenType (/FontFile3)./Tf، Tm) ويتحقق مما إذا كان 4096 × device_coord يتجاوز
فعليًا INT32_MAX — أي ما إذا كان فيض النقطة الثابتة قابلًا للوصول.الأحكام: exploit (الفيض قابل للوصول)، suspicious (هندسة مفرطة الحجم لكنها لا تفيض عند الحجم الملاحَظ)، clean.
# with uv (recommended)
uv venv
uv pip install -r requirements.txt
# or any environment with pikepdf + fonttools
python3 detect_cve_2026_86950.py suspicious.pdf
python3 detect_cve_2026_86950.py -v *.pdf # per-font details
python3 detect_cve_2026_86950.py --json f.pdf # machine-readable
رمز الخروج: 0 نظيف، 1 تم العثور على استغلال/سلوك مريب، 2 خطأ.
aa_* الخاص بـ CoreGraphics، والذي يرسم كلاً من مخططات TrueType glyf و CFF/Type2. يُضخّم الـ PoC العام الإحداثيات باستخدام الحروف المركّبة من TrueType؛ بينما يمكن لخط CFF الوصول إلى إحداثيات مفرطة الحجم مباشرةً (على سبيل المثال عبر تجميع المعاملات النسبية)، لذا يتم تحليل كلٍّ من /FontFile2 و/FontFile3. إن الاستدلال الخاص بسلسلة الحروف المركّبة خاص بـ TrueType؛ أما بالنسبة لـ CFF فإن الإشارة هي فحص الإحداثيات مفرطة الحجم / الكذب على صندوق الإحاطة./Tf، Tm) لتدفقات المحتوى هو فحص بأفضل جهد ممكن؛ فهو لا يقيّم حالة رسومات PDF / CTM بشكل كامل. عند عدم العثور على حجم، يُفترض قيمة افتراضية محافظة قدرها 1024 لفحص التجاوز. إشارات الهندسة مفرطة الحجم الملازمة للخط لا تعتمد على ذلك.