
Laboratorio basato su QEMU per riprodurre la condizione di race condition CVE-2022-46395 nel driver GPU Arm Mali r36p0. Include PoC, script di build e packaging initramfs per ricerca locale di vulnerabilità e test di regressione.
Questo repository contiene un laboratorio QEMU/no-Mali per riprodurre la condizione di trigger portabile di CVE-2022-46395 contro la linea di driver Arm Mali r36p0.
Il laboratorio è destinato alla ricerca locale di vulnerabilità e ai test di regressione. Non include il payload di escalation dei privilegi specifico per Pixel dell'exploit originale. In modalità LAB_QEMU, il PoC si ferma dopo aver dimostrato che la finestra di race condition soft-event/user-buffer è stata raggiunta.
poc/: PoC di CVE-2022-46395 adattato per QEMU. Le chiamate di logging Android e delle proprietà sono sostituite, e la patch del kernel Pixel è disabilitata sotto LAB_QEMU.src/google-gpu-raviole-android13/: sorgente del modulo GPU Google Pixel da android.googlesource.com/kernel/google-modules/gpu, ramo android-gs-raviole-5.10-android13. Il file mali_kbase/Kbuild incluso identifica il driver come r36p0-01eac0.scripts/: script di build, packaging initramfs, avvio QEMU e helper per la riproduzione one-shot.docs/: note di analisi locali e rapporti di riproduzione.logs/: log di evidenza selezionati da esecuzioni locali riuscite.I binari generati, gli archivi initramfs, i file oggetto e la maggior parte dei log di runtime sono ignorati da Git. Ricostruiscili localmente con gli script sottostanti.
Gli script sono stati utilizzati su una VM Linux con:
bash, make, gcc, file, cpio, gzip, modinfobusybox a /bin/busyboxqemu-system-x86_64Per impostazione predefinita, gli script si aspettano l'albero del kernel e l'immagine di avvio in:
../build/linux-5.10-kasan
../build/linux-5.10-kasan/arch/x86/boot/bzImage
È possibile sovrascrivere questi percorsi con KDIR e KERNEL_IMAGE.
Clona il repository e entraci:
git clone https://github.com/Gao-Zuin/cve-2022-46395-qemu.git
cd cve-2022-46395-qemu
Eseguire l'intero flusso di build/pacchettizzazione/avvio:
MAX_ATTEMPTS=2000 ./scripts/reproduce.sh
Se il tuo kernel KASAN non si trova nella directory predefinita ../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'esecuzione locale riuscita ha utilizzato questa temporizzazione:
MAX_ATTEMPTS=2000 UNMAP_OFFSET_NS=-800000 ./scripts/reproduce.sh
Per un logging più dettagliato dei tentativi:
MAX_ATTEMPTS=2000 VERBOSE_ATTEMPTS=1 UNMAP_OFFSET_NS=-800000 \
./scripts/reproduce.sh
Lo script one-shot è equivalente a:
./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
Variabili d'ambiente utili:
KDIR: albero di build del kernel usato per compilare mali_kbase.koKERNEL_IMAGE: bzImage passato a QEMUQEMU_LOG: percorso del log di outputQEMU_MEM: dimensione della memoria QEMU, default 1536MQEMU_SMP: numero di CPU QEMU, default 3MAX_ATTEMPTS: limite di tentativi del PoC, default 2000UNMAP_OFFSET_NS: offset di temporizzazione della race condition, default -800000VERBOSE_ATTEMPTS=1: stampa dettagli per tentativoKASAN_UAF_MODE=1: carica il modulo con l'opzione KASAN UAF probe usata da Un'esecuzione riuscita stampa righe come:
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
Il log di evidenza di riferimento è:
logs/qemu-cve-2022-46395-r36p0-unmap-minus800us.log
La condizione chiave di successo è err=0, read=3 e fault < reset. Ciò indica che la finestra di race condition è stata raggiunta contro r36p0-01eac0 in QEMU no-Mali.
MAX_ATTEMPTS più alto o regola UNMAP_OFFSET_NS.scripts/reproduce_kasan_uaf.sh