
نتائج أمنية في EDK2 BrotliCustomDecompressLib — إفصاح منسّق
ثغرة تجاوز سعة المخزن المؤقت في الكومة (heap-buffer-overflow) في طبقة الربط الخاصة بفك ضغط Brotli داخل EDK2
(MdeModulePkg/Library/BrotliCustomDecompressLib)، موجودة منذ 2017، وغير مُصلحة
عند HEAD حتى 2026-10-25. مؤكَّدة عبر ASAN مع إثبات مفهوم (proof-of-concept) وعرض
تلف مُتحكَّم به من البداية إلى النهاية.
تقرأ طبقة الربط الخاصة بـ Brotli في EDK2 حجم المخرجات المفكوكة من
ترويسة قسم موجَّه (GUIDed section header) يتحكم بها المهاجم، ثم تقتطع الحجم من UINT64 إلى UINT32 دون أي
حماية، وتمرّره إلى نواة DXE التي تخصّص مخزنًا مؤقتًا بذلك الحجم.
بعد ذلك يقوم BrotliDecompressInternal بفك الضغط داخل ذلك المخزن المؤقت دون حدود — إذ
يستمر حتى ينتهي تدفق Brotli، فيكتب خارج حدود التخصيص.
النتيجة: تجاوز سعة المخزن المؤقت في الكومة (بدائية كتابة) في مرحلة DXE، قبل اكتمال التحقق من Secure Boot. يمكن للمهاجم الذي يتحكم في صورة البرنامج الثابت (flash أو capsule أو ESP) أن يكتب فوق كائنات التجمع (pool) المجاورة — مؤشرات الدوال، وأعلام الأمان، وبُنى البروتوكولات — ببايتات مختارة.
هذه هي الثغرة الشقيقة المنسية لـ Brotli المقابلة لـ CVE-2021-28211 (حصل LZMA على
حماية >MAX_UINT32 في 2021؛ أما Brotli فلم يحصل عليها قط). يؤكد مسح للمتغيرات أن Brotli
هو الوحيد من مفككات ضغط EDK2 الذي يفتقر إلى كلٍّ من حماية الاقتطاع
وحدّ المخرجات.
| الملف | ما يفعله |
|---|---|
BrotliDecompress.c:238 | يحوّل الحجم المفكوك UINT64 إلى UINT32 — دون حماية MAX_UINT32 |
BrotliDecompress.c:118–157 | يفك الضغط داخل المخزن المؤقت الهدف دون أي فحص للحدود |
GuidedSectionExtraction.c | يستدعي GetInfo ثم Decompress — ويثق بالحجم المُعلَن |
CoreSectionExtraction.c:1597 | يخصّص المخزن المؤقت الهدف بالحجم المُعلَن |
كلها في tianocore/edk2، MdeModulePkg/Library/BrotliCustomDecompressLib.
| الأثر | الوصف |
|---|---|
harness/edk2_brotli_overflow_poc.c | إثبات مفهوم ASAN: تدفق بحجم 4096 بايت داخل مخزن مؤقت بحجم 64 بايت |
harness/asan_output.txt | مخرجات ASAN: heap-buffer-overflow عند BrotliDecompressInternal → memcpy |
harness/edk2_brotli_overflow_demo.c | عرض من البداية إلى النهاية: تلف مُتحكَّم به لكائنات التجمع المجاورة |
harness/demo_output.txt | مخرجات العرض: اختطاف مؤشرات الدوال، تعطيل Secure Boot |
harness/lvfs_brotli_scan.py | ماسح برامج ثابتة LVFS (قياس نطاق التأثير) |
harness/lvfs_scan_output.txt | نتائج المسح: 0/200 من صور البرامج الثابتة تستخدم Brotli |
evidence/ | نسخ من ملفات مصدر EDK2 المعرّضة للثغرة عند HEAD |
FINDINGS.md | التقرير الكامل: مراجع الأسطر، بحث الأعمال السابقة، مسح المتغيرات، تدقيق LZMA |
ضيّق. وجد مسحان مستقلان صفر منصات تستخدم أقسام Brotli الموجَّهة في الواقع العملي:
BrotliCustomDecompressLib. كل نتيجة هي MdeModulePkg.dsc نفسه.الكود المعرّض للثغرة يُشحن في شجرة EDK2 لكنه كود ميت اليوم — أُضيف في 2017، ولم تعتمده شركات IBV أو OEMs قط. الثغرة حقيقية وقابلة للاستغلال من حيث المبدأ؛ وإذا ازداد اعتماد Brotli، تصبح قابلة للوصول فورًا.
تغييران، مطابقان لما يمتلكه LZMA وTiano بالفعل:
MAX_UINT32 إلى BrotliUefiDecompressGetInfo
(BrotliDecompress.c:238): رفض الأحجام المفكوكة > MAX_UINT32، كما
يفعل LzmaDecompress.c:149 منذ CVE-2021-28211.BrotliDecompressInternal: تتبّع البايتات المكتوبة والتوقف
عند DestinationSize، كما يفعل مفكك ضغط Tiano مع mOrigSize.ابنِ إثبات المفهوم على Linux باستخدام libbrotli وGCC:
# ASAN proof (aborts at the overflow)
gcc -fsanitize=address -g -O1 -o poc harness/edk2_brotli_overflow_poc.c \
-lbrotlienc -lbrotlidec
./poc
# Controlled-corruption demo (completes the overflow, shows the damage)
gcc -g -O1 -o demo harness/edk2_brotli_overflow_demo.c \
-lbrotlienc -lbrotlidec
./demo
إفصاح عام كامل، 2026-10-26. لم تُمنح فترة إفصاح منسّق إلى TianoCore. وقد أثر في هذا القرار نطاق التأثير الضيق (عدم تأثر أي برنامج ثابت مُشحون) وكون خلل LZMA الشقيق علنيًا منذ 2021.