该仓库包含一个 QEMU/no-Mali 实验室,用于针对 Arm Mali r36p0 驱动系列复现 CVE-2022-46395 的可移植触发条件。
该实验室旨在用于本地漏洞研究和回归测试。它不包含原始利用代码中针对 Pixel 的特权提升载荷。在 LAB_QEMU 模式下,PoC 在证明已到达 soft-event/user-buffer 竞争窗口后即停止。
poc/:适配 QEMU 的 CVE-2022-46395 PoC。Android 日志和属性调用已被替换,且在 LAB_QEMU 下禁用了 Pixel 内核文本补丁。src/google-gpu-raviole-android13/:来自 android.googlesource.com/kernel/google-modules/gpu 分支 android-gs-raviole-5.10-android13 的 Google Pixel GPU 模块源码。其中包含的 mali_kbase/Kbuild 将该驱动标识为 r36p0-01eac0。scripts/:构建、initramfs 打包、QEMU 启动和一次性复现辅助脚本。docs/:本地分析笔记和复现报告。logs/:成功本地运行的部分证据日志。生成的二进制文件、initramfs 归档、目标文件以及大多数运行时日志均被 Git 忽略。请使用下面的脚本在本地重新构建。
这些脚本曾在以下 Linux 虚拟机上使用:
bash, make, gcc, file, cpio, gzip, modinfobusybox(位于 /bin/busybox)qemu-system-x86_64默认情况下,脚本预期内核源码树和启动镜像位于:
../build/linux-5.10-kasan
../build/linux-5.10-kasan/arch/x86/boot/bzImage
你可以通过 KDIR 和 KERNEL_IMAGE 覆盖这些路径。
克隆仓库并进入其中:
git clone https://github.com/Gao-Zuin/cve-2022-46395-qemu.git
cd cve-2022-46395-qemu
运行完整的构建/打包/启动流程:
MAX_ATTEMPTS=2000 ./scripts/reproduce.sh
如果你的 KASAN 内核不在默认的兄弟目录 ../build 中:
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
成功的本地运行使用了以下时序:
MAX_ATTEMPTS=2000 UNMAP_OFFSET_NS=-800000 ./scripts/reproduce.sh
如需更详细的尝试日志:
MAX_ATTEMPTS=2000 VERBOSE_ATTEMPTS=1 UNMAP_OFFSET_NS=-800000 \
./scripts/reproduce.sh
一键脚本等价于以下命令:
./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
有用的环境变量:
KDIR:用于编译 mali_kbase.ko 的内核构建树KERNEL_IMAGE:传递给 QEMU 的 bzImageQEMU_LOG:输出日志路径QEMU_MEM:QEMU 内存大小,默认 1536MQEMU_SMP:QEMU CPU 数量,默认 3MAX_ATTEMPTS:PoC 重试次数上限,默认 2000UNMAP_OFFSET_NS:竞争时序偏移,默认 -800000VERBOSE_ATTEMPTS=1:打印每次尝试的详细信息KASAN_UAF_MODE=1:使用 所用的 KASAN UAF 探测选项加载模块一次成功的运行会打印类似以下内容:
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
参考证据日志为:
logs/qemu-cve-2022-46395-r36p0-unmap-minus800us.log
关键成功条件是 err=0、read=3 且 fault < reset。这表明已在 no-Mali QEMU 中到达 r36p0-01eac0 的竞争窗口。
MAX_ATTEMPTS 重新运行,或调整 UNMAP_OFFSET_NS。scripts/reproduce_kasan_uaf.sh