
مختبر قائم على QEMU لإعادة إنتاج حالة السباق (race condition) CVE-2022-46395 في مشغل GPU Arm Mali r36p0. يتضمن PoC، ونصوص بناء، وتعبئة initramfs للبحث المحلي عن الثغرات واختبار الانحدار.
يحتوي هذا المستودع على مختبر QEMU/no-Mali لإعادة إنتاج حالة التشغيل المحمولة لـ CVE-2022-46395 ضد سلسلة برنامج تشغيل Arm Mali r36p0.
المختبر مخصص للبحث المحلي عن الثغرات واختبار الانحدار. لا يحمل حمولة تصعيد الامتيازات الخاصة بـ Pixel من الاستغلال الأصلي. في وضع LAB_QEMU، يتوقف إثبات المفهوم بعد إظهار أنه تم الوصول إلى نافذة سباق الحدث الناعم/المخزن المؤقت للمستخدم.
poc/: إثبات المفهوم CVE-2022-46395 المُكيَّف لـ QEMU. تم استبدال استدعاءات تسجيل Android والخاصية، وتم تعطيل تصحيح نص kernel Pixel تحت LAB_QEMU.src/google-gpu-raviole-android13/: وحدة مصدر GPU من Pixel Google من android.googlesource.com/kernel/google-modules/gpu، فرع android-gs-raviole-5.10-android13. يحدد الملف المضمن mali_kbase/Kbuild برنامج التشغيل كـ .r36p0-01eac0scripts/: أدوات مساعدة للبناء، وتعبئة initramfs، وتشغيل QEMU، وإعادة الإنتاج بخطوة واحدة.docs/: ملاحظات التحليل المحلية وتقارير إعادة الإنتاج.logs/: سجلات الأدلة المختارة من عمليات التشغيل المحلية الناجحة.الملفات الثنائية المُنشأة، وأرشيفات initramfs، وملفات الكائنات، ومعظم سجلات وقت التشغيل يتم تجاهلها بواسطة Git. أعد بنائها محليًا باستخدام النصوص أدناه.
تم استخدام النصوص على جهاز افتراضي Linux يعمل بـ:
bash, make, gcc, file, cpio, gzip, modinfobusybox في /bin/busyboxqemu-system-x86_64بشكل افتراضي، تتوقع النصوص وجود شجرة kernel وصورة الإقلاع في:
../build/linux-5.10-kasan
../build/linux-5.10-kasan/arch/x86/boot/bzImage
يمكنك تجاوز تلك المسارات باستخدام KDIR و KERNEL_IMAGE.
استنسخ المستودع وأدخل إليه:
git clone https://github.com/Gao-Zuin/cve-2022-46395-qemu.git
cd cve-2022-46395-qemu
شغّل تدفق البناء/التعبئة/الإقلاع الكامل:
MAX_ATTEMPTS=2000 ./scripts/reproduce.sh
إذا كان kernel KASAN الخاص بك ليس في الدليل الافتراضي المجاور ../build:
KDIR=/path/to/linux-5.10-kasan \
KERNEL_IMAGE=/path/to/linux-5.10-kasan/arch/x86/boot/bzImage \
MAX_ATTEMPTS=2000 \
./scripts/reproduce.sh
استخدمت الجولة المحلية الناجحة هذا التوقيت:
MAX_ATTEMPTS=2000 UNMAP_OFFSET_NS=-800000 ./scripts/reproduce.sh
لمزيد من تسجيل المحاولات المفصل:
MAX_ATTEMPTS=2000 VERBOSE_ATTEMPTS=1 UNMAP_OFFSET_NS=-800000 \
./scripts/reproduce.sh
النص ذو الخطوة الواحدة يعادل:
./scripts/build_r36p0_no_mali.sh
./scripts/build_poc.sh
MAX_ATTEMPTS=2000 UNMAP_OFFSET_NS=-800000 ./scripts/package_initramfs.sh
./scripts/run_qemu.sh
متغيرات البيئة المفيدة:
KDIR: شجرة بناء kernel المستخدمة لتجميع mali_kbase.koKERNEL_IMAGE: صورة bzImage الممررة إلى QEMUQEMU_LOG: مسار سجل الإخراجQEMU_MEM: حجم ذاكرة QEMU، الافتراضي 1536MQEMU_SMP: عدد وحدات المعالجة المركزية QEMU، الافتراضي 3MAX_ATTEMPTS: حد إعادة محاولة إثبات المفهوم، الافتراضي 2000UNMAP_OFFSET_NS: إزاحة توقيت السباق، الافتراضي -800000VERBOSE_ATTEMPTS=1: طباعة تفاصيل كل محاولةKASAN_UAF_MODE=1: تحميل الوحدة مع خيار فحص UAF KASAN المستخدم بواسطة scripts/reproduce_kasan_uaf.shتطبع جولة ناجحة سطورًا مثل:
mali mali.0: Kernel DDK version r36p0-01eac0
r36p0-01eac0 (UK version 11.34)
/dev/mali0
finished reset: 703956220 fault: 682115150 68 err 0 read 3
qemu lab mode: CVE-2022-46395 soft-event/user-buffer race reproduced
qemu lab mode: reproduction completed after 17 attempts
[init] PoC status: 0
سجل الأدلة المرجعي هو:
logs/qemu-cve-2022-46395-r36p0-unmap-minus800us.log
شرط النجاح الرئيسي هو err=0 و read=3 و fault < reset. يشير ذلك إلى أنه تم الوصول إلى نافذة السباق ضد r36p0-01eac0 في no-Mali QEMU.
MAX_ATTEMPTS أعلى أو اضبط UNMAP_OFFSET_NS.