
# QEMU-basiertes Labor zur Reproduktion der Race-Condition CVE-2022-46395 im Arm-Mali-r36p0-GPU-Treiber. Enthält PoC, Build-Skripte und Initramfs-Paketierung für lokale Schwachstellenforschung und Regressionstests.
Dieses Repository enthält ein QEMU/no-Mali-Labor zur Reproduktion der portablen Auslösebedingung von CVE-2022-46395 für die Arm-Mali-r36p0-Treiberlinie.
Das Labor ist für lokale Schwachstellenforschung und Regressionstests gedacht. Es
enthält nicht die Pixel-spezifische Privilege-Escalation-Payload des ursprünglichen
Exploits. Im Modus LAB_QEMU stoppt der PoC, nachdem gezeigt wurde, dass das
Soft-Event/User-Buffer-Race-Fenster erreicht wurde.
poc/: An QEMU angepasster CVE-2022-46395-PoC. Android-Logging- und Property-Aufrufe
sind ersetzt, und das Pixel-Kernel-Text-Patching ist unter LAB_QEMU deaktiviert.src/google-gpu-raviole-android13/: Google-Pixel-GPU-Modulquelle von
android.googlesource.com/kernel/google-modules/gpu, Branch
android-gs-raviole-5.10-android13. Die enthaltene mali_kbase/Kbuild
identifiziert den Treiber als .r36p0-01eac0scripts/: Helfer für Build, Initramfs-Paketierung, QEMU-Boot und einmalige Reproduktion.docs/: lokale Analyse-Notizen und Reproduktionsberichte.logs/: ausgewählte Belegprotokolle erfolgreicher lokaler Läufe.Generierte Binärdateien, Initramfs-Archive, Objektdateien und die meisten Laufzeitprotokolle werden von Git ignoriert. Baue sie lokal mit den unten stehenden Skripten neu.
Die Skripte wurden auf einer Linux-VM mit Folgendem verwendet:
bash, make, gcc, file, cpio, gzip, modinfobusybox unter /bin/busyboxqemu-system-x86_64Standardmäßig erwarten die Skripte den Kernelbaum und das Boot-Image unter:
../build/linux-5.10-kasan
../build/linux-5.10-kasan/arch/x86/boot/bzImage
Du kannst diese Pfade mit KDIR und KERNEL_IMAGE überschreiben.
Klone das Repository und wechsle hinein:
git clone https://github.com/Gao-Zuin/cve-2022-46395-qemu.git
cd cve-2022-46395-qemu
Führe den vollständigen Build-/Paket-/Boot-Ablauf aus:
MAX_ATTEMPTS=2000 ./scripts/reproduce.sh
Falls sich dein KASAN-Kernel nicht im standardmäßigen Schwesterverzeichnis ../build befindet:
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
Der erfolgreiche lokale Lauf verwendete dieses Timing:
MAX_ATTEMPTS=2000 UNMAP_OFFSET_NS=-800000 ./scripts/reproduce.sh
Für eine ausführlichere Protokollierung der Versuche:
MAX_ATTEMPTS=2000 VERBOSE_ATTEMPTS=1 UNMAP_OFFSET_NS=-800000 \
./scripts/reproduce.sh
Das Einmal-Skript entspricht:
./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
Nützliche Umgebungsvariablen:
KDIR: Kernel-Build-Verzeichnis zum Kompilieren von mali_kbase.koKERNEL_IMAGE: an QEMU übergebenes bzImageQEMU_LOG: Pfad für das AusgabeprotokollQEMU_MEM: QEMU-Speichergröße, Standard 1536MQEMU_SMP: QEMU-CPU-Anzahl, Standard 3MAX_ATTEMPTS: PoC-Wiederholungslimit, Standard 2000UNMAP_OFFSET_NS: Race-Timing-Offset, Standard -800000VERBOSE_ATTEMPTS=1: Details zu jedem Versuch ausgebenKASAN_UAF_MODE=1: Modul mit der KASAN-UAF-Sondenoption laden, die von
scripts/reproduce_kasan_uaf.sh verwendet wirdEin erfolgreicher Lauf gibt Zeilen wie die folgenden aus:
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
Das Referenz-Beweisprotokoll ist:
logs/qemu-cve-2022-46395-r36p0-unmap-minus800us.log
Die wichtigste Erfolgsbedingung ist err=0, read=3 und fault < reset. Das
zeigt an, dass das Race-Fenster gegen r36p0-01eac0 in no-Mali-QEMU erreicht wurde.
MAX_ATTEMPTS aus oder passe UNMAP_OFFSET_NS an.