
تخصيص ذاكرة غير محدود في معالج UFS الخاص بـ NanaZip عبر حقل `fs_bsize` الذي يتحكم فيه المهاجم.
| الحقل | القيمة |
|---|
| CVE | CVE-2026-55781 |
| الإشعار | GHSA-m34h-jf84-m74h |
| المورّد | M2Team / NanaZip |
| المتأثر | NanaZip <= 6.5 Preview (6.5.1742.0) |
| المُصلَح | 6.5.1749.0 |
| التصنيف | حجب الخدمة (CWE-789: تخصيص الذاكرة بقيمة حجم مفرطة) |
| المنصة | Windows |
| المؤلف | g17hubH4ck |
| تاريخ الإفصاح | 2026-07-17 |
يقرأ NanaZip.Codecs.Archive.Ufs.cpp الكتلة الفائقة (superblock) الخاصة بـ UFS ويتحقق من
fs_bsize مقابل حد أدنى فقط (MINBSIZE). لا يتم فرض أي حد أعلى
قبل استخدام القيمة لتحديد حجم التخصيصات.
عندما يعلن الـ inode الجذري (#2) عن di_size كبير بما يكفي ليتطلب
كتل غير مباشرة (indirect blocks)، يخصص المحلل مخزنًا مؤقتًا واحدًا لكل مستوى غير مباشر باستخدام
fs_bsize. تعيين fs_bsize = 0x40000000 (1 GiB) و
di_size = 0x10000000000 (1 TiB) يفرض ثلاثة تخصيصات بحجم 1 GiB
(Ufs.cpp:435-437) — ما يقارب 3 GiB من الذاكرة المتجاورة — قبل تشغيل أي
فحص للحدود.
النتيجة: استنفاد الذاكرة وإنهاء العملية. لا يوجد تنفيذ لأي كود.
| المنطقة | الإزاحة | ملاحظات |
|---|---|---|
الـ inode الجذري #2 | 512 | ufs2_dinode، 256 بايت، di_mode = IFDIR، di_size = 1 TiB |
| الكتلة الفائقة UFS2 | 65536 (SBLOCK_UFS2) | struct fs، little-endian، fs_bsize = 0x40000000 |
| الحجم الإجمالي | 66912 بايت | SBLOCK_UFS2 + sizeof(struct fs) |
حقول الكتلة الفائقة الرئيسية (الإزاحات من offsetof(struct fs, ...) في fs.h الخاص بـ FreeBSD):
| الإزاحة | الحقل | القيمة |
|---|---|---|
+16 | fs_iblkno | 0 |
+44 | fs_ncg | 1 |
+48 | fs_bsize | 0x40000000 ← خبيث |
+52 | fs_fsize | 1 |
+56 | fs_frag | 1 |
+104 | fs_sbsize | 1376 |
+1000 | fs_sblockloc | 65536 |
+1372 | fs_magic | 0x19540119 (FS_UFS2_MAGIC) |
عنوان الـ inode الجذري: GetInodeOffset(2) = fs_iblkno * fs_fsize + 2 * 256 = 512.
python3 poc.py poc.img
يكتب السكربت الصورة المشوّهة ويعيد تحليلها للتأكد من أن كل حقل استقر حيث يتوقعه المحلل المعرّض للثغرة. لا يوجد وصول للشبكة، ولا عمليات فرعية، ولا حمولة مسلّحة — ملف النقل وحده غير ضار.
التحقق
يمكن فحص الصورة المُنشأة دون NanaZip:
xxd -s 65536 -l 64 poc.img # superblock header
xxd -s 512 -l 32 poc.img # root inode header
لملاحظة الانهيار، افتح poc.img باستخدام إصدار معرّض للثغرة على Windows. تتعامل الإصدارات 6.5.1749.0 وما بعدها مع المدخلات بشكل صحيح.
ملاحظة: تم إنشاء هذا PoC عبر التحليل الساكن لمحلل NanaZip.Codecs. يصل إلى السطر المعرّض للثغرة بالضبط كما هو موثق في الإشعار، لكنه لم يُنفَّذ ضد إصدار NanaZip قيد التشغيل.
التخفيف
· الترقية إلى NanaZip >= 6.5.1749.0. · إذا لم يكن الترقية ممكنة، تجنّب فتح صور UFS من مصادر غير موثوقة.
المراجع
· NanaZip: https://github.com/M2Team/NanaZip · الإشعار: GHSA-m34h-jf84-m74h · CWE-789: https://cwe.mitre.org/data/definitions/789.html
إخلاء المسؤولية
تُقدَّم هذه المواد لأغراض البحث الدفاعي وإعادة إنتاج الثغرات في بيئات مُتحكَّم بها فقط. لا تستخدمها ضد أنظمة لا تملكها أو لا تملك إذنًا صريحًا لاختبارها.