
CVE-2026-74945 · إفشاء بيانات من الكومة غير المهيأة عبر خط ويب مُصمَّم (sec-high)
الخطورة الأمنية عالية. CWE 908 وCWE 200. أُصلح في Firefox 154. Bugzilla 2057808. يمكن الوصول إليه من صفحة ويب عادية عبر @font-face.
يقوم Firefox بتنقية خطوط الويب عبر OTS قبل استخدامها. تتظافر ثلاثة عيوب بحيث يعيد خط مُصمَّم خصيصًا ذاكرة كومة غير مهيأة من عملية المتصفح إلى الصفحة. استدعاء واحد لـ measureText يقرؤها بمعدل وحدتي بايت في المرة الواحدة عبر نافذة بحجم 64 كيلوبايت.
ينمو تدفق مخرجات OTS باستخدام moz_xrealloc الذي لا يُصفّر الذاكرة أبدًا. وتقبل Seek أي موضع حتى حجم التخصيص دون أن تملأ الفجوة بالأصفار. وتضبط forget حجم المخزن المؤقت على أعلى إزاحة تم الوصول إليها. وبالتالي، تُسلَّم أي فجوة بين آخر كتابة وSeek إلى الأمام إلى المستدعي حاملةً ذاكرة كومة قديمة.
جدول فرعي بتنسيق cmap 14 بقيمة nonDefaultUVSOffset كبيرة يجعل المُسلسِل ينتقل إلى الأمام ويترك الفجوة داخل الخط المُصدَر. ويُصدَر جدول فرعي مصاحب بتنسيق 4 مع id_range_offset فردي في المقطع الأخير حرفيًا. يستخدم التحقق من حدود البحث عن الصور الرمزية بقية cmap الكامل وليس الجدول الفرعي. تمر القفزة إلى منطقة الجدول الفرعي المجاور.
تصل MapCharToGlyphFormat4 إلى المقطع المُصمَّم وتُعيد معرّف صورة رمزية مقروءًا من الفجوة. ويمكن قياس مقدار تقدم hmtx مباشرةً من canvas.

pip install fonttools brotli
python3 make_poc_font.py # builds poc.woff
# serve this folder and open poc.html
يطبع poc.html عرض التقدم لـ U+FFFF عند كل قراءة. وتعكس كل قيمة معرّف صورة رمزية يُقرأ من الفجوة. لمشاهدة وحدات بايت غير مهيأة غير صفرية، استخدم بنية MSan أو بنية mozjemalloc التي تملأ الذاكرة بقيم عشوائية. يتأثر النظام على Windows عبر DWrite وعلى macOS عبر CoreText. يعمل OTS داخل العملية دون حماية (sandbox).
إفصاح عن ذاكرة كومة عملية غير مهيأة يمكن التحكم فيه عبر الويب وتكراره، ويمكنه كشف مؤشرات أو أسرار.
تغييران؛ أيٌّ منهما يكفي لكسر السلسلة. صفِّر النطاق المُخصَّص حديثًا في تدفق مخرجات OTS. وتحقق من طول الجدول الفرعي ذي التنسيق 4 بحيث لا يمكن للبحث أن يحدد حدوده على بقية cmap. طبّق Firefox التغييرين معًا.
Abdulaziz Alasaiqah · https://azoz.my/writeups.html