本地 Mali GPU 驱动分析与复现工作区,用于研究 docs/ 目录下的 CVE 笔记。仓库有意将源笔记、脚本、PoC 和小型辅助文件纳入 git 管理,而较大的外部源码树和构建产物则在 clone 或 pull 后在本地重新生成。
docs/ 详细环境笔记与 CVE 复现路线
scripts/ 环境检查、源码引导、构建与 QEMU 辅助脚本
pocs/ 用户态与内核态概念验证源码
models/ 小型本地生命周期模型
tools/ 辅助模块与工具
sources/ 外部驱动/内核源码树,大部分仅存于本地
build/ 生成的内核、模块、initramfs 镜像与二进制文件
logs/ 生成的构建/QEMU/模型日志
sources/、build/ 以及 logs/ 中的大部分内容不属于可移植的项目状态。磁盘占用过高时可以删除并重新生成。
从仓库根目录执行以下命令。
脚本依赖于具备常用内核构建和 QEMU 工具的 Linux 环境:
sudo apt update
sudo apt install -y \
git gcc clang make lld llvm bc bison flex libssl-dev libelf-dev dwarves \
qemu-system-arm qemu-system-x86 qemu-user gcc-aarch64-linux-gnu \
gdb-multiarch python3 python3-pip python3-venv cmake ninja-build \
pkg-config jq ccache busybox cpio检查当前机器环境:
scripts/check_env.sh缺失的工具需在本地安装,它们不会存储在仓库中。
获取脚本所使用的 Mali 驱动源码镜像:
scripts/bootstrap_mali_sources.sh这将在 sources/ 下重新填充本地源码目录,如 sources/nest-mali-driver/ 及其他外部镜像。如果某个源码树已存在,脚本会打印其远程地址和当前 commit,而非覆盖它。
某些较早的本地实验可能引用额外的源码树,例如 sources/nest-mali-driver-full/。这些是较大的本地检出,需要时可通过相同的上游或本地存档恢复特定版本。
QEMU/无 Mali 路径默认使用一个预配置的内核构建目录:
build/linux-5.10-kasan
该目录是生成的,已被有意忽略。在全新 clone 之后,必须先重新创建它才能运行 QEMU 模块脚本。典型流程如下:
mkdir -p sources build
# 本地提供 linux-5.10.tar.xz,或从 kernel.org 下载。
tar -xf sources/linux-5.10.tar.xz -C sources
mv sources/linux-5.10 sources/linux-5.10-kasan-src
make -C sources/linux-5.10-kasan-src O="$PWD/build/linux-5.10-kasan" x86_64_defconfig
sources/linux-5.10-kasan-src/scripts/config --file build/linux-5.10-kasan/.config \
-e KASAN \
-e KASAN_INLINE \
-e DEBUG_INFO \
-e MODULES
make -C sources/linux-5.10-kasan-src O="$PWD/build/linux-5.10-kasan" olddefconfig
make -C sources/linux-5.10-kasan-src O="$PWD/build/linux-5.10-kasan" -j"$(nproc)"如果你本地已有兼容的预配置内核树,可以通过 KDIR=/path/to/kernel/build 直接使用,而无需重建这个默认目录。
大多数 QEMU 辅助脚本期望 mali_kbase.ko 是针对预配置内核树构建的。示例:
KDIR=build/linux-5.10-kasan \
scripts/mali_qemu_no_mali/build_mali_no_mali_module.sh bifrost r25p0
KDIR=build/linux-5.10-kasan \
scripts/mali_qemu_no_mali/build_mali_no_mali_module.sh bifrost r44p0
MALI_CSF_SUPPORT=y KDIR=build/linux-5.10-kasan \
scripts/mali_qemu_no_mali/build_mali_no_mali_module.sh valhall r44p0驱动树中生成的 .ko、.o、.cmd、Module.symvers 和 modules.order 文件已被忽略,应在本地重新构建。
PoC 二进制文件、initramfs 目录、压缩的 cpio 镜像以及 QEMU 日志都是在 build/ 和 logs/ 下生成的产物。
使用运行脚本为特定实验重新生成所需内容:
scripts/mali_qemu_no_mali/run_cve_2021_28663_r25p0.sh
scripts/mali_qemu_no_mali/run_cve_2023_34970_r44p0_uapi_probe.sh
scripts/mali_success_proofs/run_controlled_34970_r44_uaf.sh
scripts/build_and_run_models.sh关于当前的复现状态、预期日志和报告说明,请参阅 docs/环境配置与复现路线.md。
以下是生成或本地恢复的内容,可以删除以释放空间:
rm -rf build/
find logs -type f -name '*.log' -delete
find sources \( -name '*.o' -o -name '*.ko' -o -name '*.mod.c' -o -name '.*.cmd' \) -delete仅在确认可以重新创建时才删除展开的内核树:
rm -rf sources/linux-5.10-kasan-src不要删除 docs/、scripts/、pocs/、models/ 或 tools/,除非你有意移除项目源文件。