
Laboratorio basado en QEMU para reproducir la condición de carrera CVE-2022-46395 en el controlador de GPU Arm Mali r36p0. Incluye PoC, scripts de compilación y empaquetado de initramfs para la investigación local de vulnerabilidades y pruebas de regresión.
Este repositorio contiene un laboratorio QEMU/no-Mali para reproducir la condición desencadenante portable de CVE-2022-46395 contra la familia de controladores Arm Mali r36p0.
El laboratorio está pensado para investigación local de vulnerabilidades y
pruebas de regresión. No incluye la carga útil de escalada de privilegios
específica de Pixel del exploit original. En el modo LAB_QEMU, el PoC se
detiene después de demostrar que se alcanzó la ventana de carrera
soft-event/user-buffer.
poc/: PoC de CVE-2022-46395 adaptado a QEMU. Las llamadas de registro y
propiedades de Android se reemplazan, y el parcheo de texto del kernel de
Pixel está deshabilitado bajo LAB_QEMU.src/google-gpu-raviole-android13/: código fuente del módulo de GPU de
Google Pixel de android.googlesource.com/kernel/google-modules/gpu, rama
android-gs-raviole-5.10-android13. El incluido
identifica el controlador como .mali_kbase/Kbuildr36p0-01eac0scripts/: compilación, empaquetado de initramfs, arranque de QEMU y
utilidades de reproducción de una sola ejecución.docs/: notas de análisis local e informes de reproducción.logs/: registros de evidencia seleccionados de ejecuciones locales
exitosas.Los binarios generados, los archivos initramfs, los ficheros objeto y la mayoría de los registros de ejecución son ignorados por Git. Reconstruye estos localmente con los scripts siguientes.
Los scripts se usaron en una máquina virtual Linux con:
bash, make, gcc, file, cpio, gzip, modinfobusybox en /bin/busyboxqemu-system-x86_64Por defecto, los scripts esperan el árbol del kernel y la imagen de arranque en:
../build/linux-5.10-kasan
../build/linux-5.10-kasan/arch/x86/boot/bzImage
Puedes sobrescribir esas rutas con KDIR y KERNEL_IMAGE.
Clona el repositorio y accede a él:
git clone https://github.com/Gao-Zuin/cve-2022-46395-qemu.git
cd cve-2022-46395-qemu
Ejecuta el flujo completo de compilación/empaquetado/arranque:
MAX_ATTEMPTS=2000 ./scripts/reproduce.sh
Si tu kernel KASAN no está en el directorio hermano ../build predeterminado:
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
La ejecución local exitosa usó esta temporización:
MAX_ATTEMPTS=2000 UNMAP_OFFSET_NS=-800000 ./scripts/reproduce.sh
Para un registro de intentos más detallado:
MAX_ATTEMPTS=2000 VERBOSE_ATTEMPTS=1 UNMAP_OFFSET_NS=-800000 \
./scripts/reproduce.sh
El script de una sola ejecución equivale 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
Variables de entorno útiles:
KDIR: árbol de compilación del kernel usado para compilar mali_kbase.koKERNEL_IMAGE: bzImage pasado a QEMUQEMU_LOG: ruta del registro de salidaQEMU_MEM: tamaño de memoria de QEMU, por defecto 1536MQEMU_SMP: número de CPUs de QEMU, por defecto 3MAX_ATTEMPTS: límite de reintentos del PoC, por defecto 2000UNMAP_OFFSET_NS: desplazamiento de temporización de la carrera, por
defecto -800000VERBOSE_ATTEMPTS=1: imprime los detalles de cada intentoKASAN_UAF_MODE=1: carga el módulo con la opción de sonda KASAN UAF usada
por scripts/reproduce_kasan_uaf.shUna ejecución exitosa imprime líneas como:
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
El registro de evidencia de referencia es:
logs/qemu-cve-2022-46395-r36p0-unmap-minus800us.log
La condición clave de éxito es err=0, read=3 y fault < reset. Eso indica
que se alcanzó la ventana de carrera contra r36p0-01eac0 en QEMU sin Mali.
MAX_ATTEMPTS mayor o ajusta UNMAP_OFFSET_NS.