
تخصيص ذاكرة غير محدود في معالج UFS الخاص بـ NanaZip عبر حقل `fs_bsize` الذي يتحكم فيه المهاجم.
تخصيص ذاكرة غير محدود في معالج 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
إخلاء المسؤولية
تُقدَّم هذه المواد لأغراض البحث الدفاعي وإعادة إنتاج الثغرات في بيئات خاضعة للرقابة فقط. لا تستخدمها ضد أنظمة لا تملكها أو لا تملك إذنًا صريحًا لاختبارها.