
هذه الأداة تحسب رسم هوفمان القانوني الصعب لـ CVE-2023-4863.
تحسب هذه الأداة مدرجًا تكراريًا خادعًا لهوفمان المتعارف عليه، والذي يمكنه تحفيز كتابة خارج النطاق (OOB) لمكتبة libwebp الضعيفة (أي libwebp <= 1.3.1). تُعرف هذه الثغرة باسم CVE-2023-4863 أو CVE-2023-41064. يمكننا تجاوز سعة جدول هوفمان المخصص مسبقًا بما يصل إلى 132 مدخلًا.
المنطق هو أن libwebp تفترض أن المدرج التكراري لهوفمان الموجود في كل صورة webp منسق بشكل جيد. أي أن شجرة فك التشفير يجب أن تكون شجرة كاملة. مع هذا الافتراض، استفاد فريق libwebp من أداة enough لتقدير الحد الأقصى لحجم الذاكرة لبناء جدول هوفمان لفك التشفير (بنية قوية لفك رموز هوفمان المتعارف عليها بسرعة). ومع ذلك، يستطيع القراصنة بناء شجرة غير كاملة لتجاوز حد الذاكرة هذا وبالتالي تجاوز سعة الذاكرة المخصصة مسبقًا.
تم إنشاء أداة الاختراق هذه عن طريق تعديل enough لدعم الأشجار غير الكاملة.
قم بتجميع الكود باستخدام الأمر التالي:
gcc -o NotEnough ./main.c
بالنسبة لجدول هوفمان يحتوي على 40 رمزًا، وجدول جذر 8 بت، وأقصى عمق 15، فإن الحد الأقصى لعدد مداخل الجدول هو 410. ومع ذلك، عن طريق بناء شجرة غير مكتملة، يمكن أن يصل عدد مداخل الجدول إلى 542. جرب الأمر التالي:
./NotEnough 40 8 15
مثال على هذه الأشجار كالتالي:
لاحظ أننا قمنا بتقليم الفروع التي لا تحتوي على أوراق للاختصار.
يمكنك بعد ذلك استخدام أداة craft لبناء صورة webp فعالة لتجاوز سعة أداة dwebp (إصدار <= 1.3.1). قم بتغيير المدرج التكراري لرمز هوفمان code_lengths_counts[4] إلى {0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 5, 9, 17, 1, 1, 3} وفقًا لذلك، وأعد بناء الأداة:
vim craft.c # Change huffman code histogram accordingly, i.e. about line 495.
gcc -o craft craft.c
./craft -o bad_542.webp
يرجى مراجعة مدونة @benhawkes للحصول على فكرة أفضل عن CVE-2023-4863.