
Linux kernel FUSE readdir cache out-of-bounds write (CVE-2026-31694): a malicious FUSE server overflows a page-cache page by 24 bytes. PoC plus an unprivileged local-root exploit via /etc/passwd page-cache corruption. Run only inside a VM.
خلل في التحقق من الحدود في fs/fuse/readdir.c:fuse_add_dirent_to_cache(). يُرجع خادم FUSE اتجاهًا بقيمة namelen = 4095، والذي يُسلسل إلى سجل بحجم 4120 بايت. تنسخه النواة إلى صفحة واحدة بحجم 4096 بايت من ذاكرة التخزين المؤقت للصفحات، وتتجاوز بـ 24 بايت يتحكم بها الخادم إلى الصفحة المادية التالية.
يحتوي هذا المستودع على إثبات مفهوم (PoC) للكتابة الأولية، وتصعيد صلاحيات محلي يقوم بتهيئة التجاوز على نسخة ذاكرة التخزين المؤقت للصفحات من /etc/passwd ويجعل الجذر حسابًا بدون كلمة مرور.
FUSE_NAME_MAX إلى PATH_MAX - 1 مسار readdir قابلًا للوصول)51a8de6c50bf9 "fuse: رفض الأدلة كبيرة الحجم في ذاكرة التخزين المؤقت للصفحات" (واحد من خمسة backports مستقرة)التجاوز هو كتابة kernel إلى أي صفحة مادية تقع مباشرة بعد صفحة ذاكرة التخزين المؤقت لـ FUSE. تهدف هذه التهيئة إلى توجيه الكتابة إلى صفحة محددة، لكنها احتمالية. في حالة الخطأ، يمكن أن تصيب الـ 24 بايت صفحة غير مرتبطة:
قم بتشغيله فقط داخل آلة افتراضية يمكن التخلص منها. دائمًا ما تقوم البرامج النصية هنا بتشغيل الاستغلال داخل QEMU/KVM، وليس على المضيف أبدًا.
exploit.c إثبات المفهوم وتصعيد الصلاحيات المحلي (ملف واحد، بناء ثابت)
Makefile بناء ./exploit (ثابت)
vm/config.sh جميع المسارات والإعدادات (قم بتحرير KERNEL_TREE)
vm/make_rootfs.sh بناء صورة الضيف Ubuntu 24.04 (شغّل كجذر)
vm/build_vuln_kernel.sh بناء bzImage معرضة للخطر من شجرة kernel الخاصة بك
vm/run_vm.sh تشغيل الضيف بدون واجهة
vm/provision_guest.sh إعداد داخل الضيف (يعمل عبر SSH)
vm/run_in_vm.sh أمر واحد: تشغيل، إعداد، تنفيذ، تحقق
المضيف: لينكس مع KVM (/dev/kvm موجود، المستخدم في مجموعة kvm)، و:
qemu-system-x86_64، sshpass، gcc، makemake_rootfs.sh: debootstrap (وجذر)تحتاج أيضًا إلى شجرة مصدر kernel لينكس لبناء kernel معرض للخطر.
قم بتحرير vm/config.sh. القيمة الوحيدة التي يجب تعيينها هي KERNEL_TREE: المسار إلى نسخة من شجرة لينكس. استخدم مراجعة قبل الإصلاح 51a8de6c50bf9 (أي نسخة 6.15..7.0 بها الخلل). إذا كانت الشجرة تحتوي بالفعل على الإصلاح، فإن build_vuln_kernel.sh يزيل الحاجز من أجل البناء ثم يستعيد الملف بعد ذلك. كل شيء آخر (الذاكرة، وحدات المعالجة المركزية، منفذ SSH، مسارات الصور) له إعداد افتراضي يمكنك تركه. يمكن تعيين أي قيمة أيضًا من البيئة، على سبيل المثال KERNEL_TREE=/path/to/linux vm/run_in_vm.sh.
قم ببناء صورة الضيف (Ubuntu 24.04، يحتاج إلى صلاحيات جذر لـ debootstrap):
sudo vm/make_rootfs.sh
يؤدي هذا إلى إنشاء مستخدم sudo test:test، ووحدة تحكم تسلسلية، ومصادقة كلمة مرور ssh، و fuse3.
قم ببناء kernel المعرض للخطر:
vm/build_vuln_kernel.sh
من البداية إلى النهاية (تشغيل، إعداد، إثبات المفهوم العلامة، تصعيد الصلاحيات المحلي، التحقق من uid 0):
vm/run_in_vm.sh
يدويًا:
vm/run_vm.sh & # تشغيل بدون واجهة؛ تذهب وحدة التحكم إلى vm/serial.log
make # بناء الاستغلال الثابت
# انسخ ./exploit إلى الضيف، ثم كمستخدم test:
./exploit --poc -n 20 # اختبار العلامة
./exploit # تسخين، ثم تصعيد الصلاحيات المحلي
إيقاف VM:
pkill -f bzImage-fuse-vuln
--poc وضع العلامة فقط، بدون تغييرات /etc/passwd
-n N عدد الجولات
(بدون وسائط) 5 جولات تسخين، ثم ما يصل إلى 200 محاولة تصعيد صلاحيات؛ عند النجاح يكتب
سطر جذر بدون كلمة مرور إلى /etc/passwd ويمسح المخابئ
وضع العلامة يطبع عدد الضربات لكل جولة والإجمالي، على سبيل المثال 20/20 (100.0%).
وضع تصعيد الصلاحيات المحلي يطبع Warmup: 5/5، ثم سطر LPE n/200 ... HIT!، ويغير السطر الأول من /etc/passwd من root:x:0:0:root:/root:/bin/bash إلى root::0:0:root:/root:/bin/sh، ويؤدي su -s /bin/sh root التالي مع كلمة مرور فارغة إلى إرجاع uid 0.
يقوم مسار ذاكرة التخزين المؤقت لـ readdir بنسخ كل اتجاه إلى صفحة من ذاكرة التخزين المؤقت للصفحات. يتحقق التحقق من الحجم فقط مما إذا كان الاتجاه يتناسب مع المساحة المتبقية من الصفحة الحالية؛ لا يسأل أبدًا عما إذا كان الاتجاه يتناسب مع صفحة على الإطلاق. مع namelen = 4095 يكون السجل 4120 بايت، لذلك يمتد النسخ 24 بايت بعد نهاية صفحة جديدة.
يقوم الاستغلال بتفريغ قوائم الصفحات الحرة لكل CPU (PCP) بحيث يقوم الموزع بتسليم صفحات متجاورة فيزيائيًا من تقسيمات buddy، ثم يرتب صفحة ذاكرة التخزين المؤقت لـ readdir وصفحة ضحية لتكونا متجاورتين. بالنسبة لتصعيد الصلاحيات المحلي، الضحية هي نسخة ذاكرة التخزين المؤقت للصفحات من /etc/passwd: التجاوز بـ 24 بايت يعيد كتابة سطر الجذر بحيث يكون حقل كلمة المرور فارغًا، ومع nullok PAM (الإعداد الافتراضي لأوبونتو) ينجح su root بكلمة مرور فارغة.
الشرح الكامل: https://cyberstan.co.uk/fuse-readdir-oob/
تم الإبلاغ عنه إلى المنبع بواسطة Qi Tang و Zijun Hu؛ تمت كتابة الإصلاح بواسطة Samuel Page. لقد وجدت هذا وأبلغت عنه بشكل مستقل. الفضل المنبع و CVE-2026-31694 ملك لهم. الخلل تم إصلاحه في السلسلة الرئيسية وفي الأشجار المستقرة.
MIT، انظر LICENSE. للأغراض التعليمية والاختبار المصرح به فقط.