
Laboratoire basé sur QEMU pour reproduire la condition de course CVE-2022-46395 dans le pilote GPU Arm Mali r36p0. Inclut un PoC, des scripts de construction et un packaging initramfs pour la recherche locale de vulnérabilités et les tests de régression.
Ce dépôt contient un laboratoire QEMU/no-Mali pour reproduire la condition de déclenchement portable de CVE-2022-46395 contre la lignée de pilotes Arm Mali r36p0.
Le laboratoire est destiné à la recherche locale de vulnérabilités et aux tests de régression. Il ne comporte pas la charge utile d'élévation de privilèges spécifique à Pixel de l'exploit original. En mode LAB_QEMU, le PoC s'arrête après avoir démontré que la fenêtre de course (race) soft-event/user-buffer a été atteinte.
poc/ : PoC CVE-2022-46395 adapté pour QEMU. Les appels de journalisation et de propriétés Android sont remplacés, et le patching du texte du noyau Pixel est désactivé sous LAB_QEMU.src/google-gpu-raviole-android13/ : source du module GPU Google Pixel depuis android.googlesource.com/kernel/google-modules/gpu, branche android-gs-raviole-5.10-android13. Le fichier inclus identifie le pilote comme .mali_kbase/Kbuildr36p0-01eac0scripts/ : scripts d'assistance pour la construction, le packaging initramfs, le démarrage QEMU et la reproduction en un coup.docs/ : notes d'analyse locales et rapports de reproduction.logs/ : journaux de preuve sélectionnés de exécutions locales réussies.Les binaires générés, les archives initramfs, les fichiers objets et la plupart des journaux d'exécution sont ignorés par Git. Reconstruisez-les localement avec les scripts ci-dessous.
Les scripts ont été utilisés sur une machine virtuelle Linux avec :
bash, make, gcc, file, cpio, gzip, modinfobusybox at /bin/busyboxqemu-system-x86_64Par défaut, les scripts attendent l'arbre du noyau et l'image de démarrage à :
../build/linux-5.10-kasan
../build/linux-5.10-kasan/arch/x86/boot/bzImage
Vous pouvez remplacer ces chemins avec KDIR et KERNEL_IMAGE.
Clonez le dépôt et entrez dans celui-ci :
git clone https://github.com/Gao-Zuin/cve-2022-46395-qemu.git
cd cve-2022-46395-qemu
Exécutez le flux complet de construction/paquet/démarrage :
MAX_ATTEMPTS=2000 ./scripts/reproduce.sh
Si votre noyau KASAN n'est pas dans le répertoire frère par défaut ../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
L'exécution locale réussie a utilisé ce minuteur :
MAX_ATTEMPTS=2000 UNMAP_OFFSET_NS=-800000 ./scripts/reproduce.sh
Pour une journalisation plus verbose des tentatives :
MAX_ATTEMPTS=2000 VERBOSE_ATTEMPTS=1 UNMAP_OFFSET_NS=-800000 \
./scripts/reproduce.sh
Le script en un coup équivaut à :
./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
Variables d'environnement utiles :
KDIR : arbre de construction du noyau utilisé pour compiler mali_kbase.koKERNEL_IMAGE : bzImage passé à QEMUQEMU_LOG : chemin du journal de sortieQEMU_MEM : taille mémoire QEMU, par défaut 1536MQEMU_SMP : nombre de CPU QEMU, par défaut 3MAX_ATTEMPTS : limite de tentatives du PoC, par défaut 2000UNMAP_OFFSET_NS : décalage temporel de la race, par défaut -800000VERBOSE_ATTEMPTS=1 : afficher les détails par tentativeKASAN_UAF_MODE=1 : charger le module avec l'option de sonde KASAN UAF utilisée par scripts/reproduce_kasan_uaf.shUne exécution réussie affiche des lignes comme :
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
Le journal de preuve de référence est :
logs/qemu-cve-2022-46395-r36p0-unmap-minus800us.log
La condition de succès clé est err=0, read=3, et fault < reset. Cela indique que la fenêtre de course a été atteinte contre r36p0-01eac0 dans le QEMU sans Mali.
MAX_ATTEMPTS plus élevé ou ajustez UNMAP_OFFSET_NS.