通过 CVE-2025-21479 和一个基于 perf 的物理地址泄露,在引导加载程序锁定的 ASUS Zenfone 9 上获取临时 root(uid 0)。GPLv3。
针对引导加载程序无法解锁的 ASUS Zenfone 9 (AI2202) 获取**临时 root(uid 0)**的研究代码与笔记——因为 ASUS 已停止提供解锁工具,从开发者选项中移除了 OEM 解锁开关,并在当前固件上硬性拒绝 fastboot oem unlock / flashing unlock。
这不是引导加载程序解锁,也不会刷写任何东西。这是一种运行时 root:一条设备端原语链,最终使调用进程持有 root 凭据。重启即清除。
已验证于:ASUS Zenfone 9 (AI2202),Android 14,构建号 34.0304.2004.145,SPL 2024-07-05,
内核 5.10.205-android12-9-00029-g3f12df86bfdb-ab11799032,SM8475 / Adreno 730,引导加载程序已锁定。
授权 / 范围。 此处所有内容均针对操作者自己拥有的设备运行,通过授权的 ADB 连接进行。不攻击任何厂商服务器,不绕过任何签名密钥或解锁令牌,也不向任何分区写入任何内容。用于开发的手机是备用机,已备份并保持离线。请在你拥有且能承受损坏的硬件上进行测试。
| 阶段 | 作用 | 位置 |
|---|---|---|
| 1 | CVE-2025-21479(Adreno KGSL):一个 SDS 数据包被错误分类为 ringbuffer 数据包,使用户态能够发出 CP_SMMU_TABLE_UPDATE 并将 GPU 的 TTBR0 指向攻击者选择的物理地址 | src/cheese.c |
| 2 | 物理地址泄露:此构建上 perf_event_paranoid = -1,因此对我们拥有的页面设置硬件观察点会返回 PERF_SAMPLE_PHYS_ADDR——即该页面的物理地址。替代了上游依赖的 pagemap 泄露(此处 PFN 被清零) | src/pa_leak.{c,h} |
| 3 | 任意物理读写:在已知物理地址(来自阶段 2)处构建伪造页表,因此无需 spray 抽奖,也无需野指针遍历 | src/cheese_pa.c |
| 4 | Root:从固件镜像离线解析内核符号,在设备上推导 KASLR 偏移,用 commit_creds(&init_cred) 桩补丁 __do_sys_capset,调用 capset() | src/call_capset.c、scripts/ |
结果是在 u:r:kernel:s0 SELinux 上下文中获得 uid 0(它继承了 init_cred 的 SID),即实际上不受限制。此步骤要求 SELinux 处于 Permissive 模式——在 Enforcing 模式下进程会被杀死,因为凭据交换绕过了 SELinux 钩子。
首先将 ZF9_SERIAL 设置为你的设备序列号(所有脚本都会读取它):
export ZF9_SERIAL=<your-device-serial>
# 0. 一次性操作:构建并推送设备端二进制文件(需要 Android NDK)
# 参见 scripts/ 中使用的确切 clang 调用
adb push cheese_pa call_capset /data/local/tmp/
# 1. 完整流程:SELinux -> permissive,打补丁,以 root 运行命令,恢复一切
scripts/root-now.sh id
scripts/root-now.sh sh # root shell
该脚本始终恢复原始内核文本和 SELinux 状态(受 trap 保护),并通过回读验证恢复。
uid=0(root) gid=0(root) context=u:r:kernel:s0,
capset(NULL,NULL) -> 0。gpu fault threshold exceeded 3 faults in 3000 msecs),之后进一步的命令会以 EPERM 失败。观察到的补丁成功率在不同运行间介于 13/13 到 2/13 个 dword 之间。screenrecord 负载时为 11-13/13。脚本会为每次操作启动自己的负载(读取也存在竞态),但绝不裸运行这些工具的内部控制逻辑。capset 调用者可能执行垃圾指令)。脚本最后写入入口指令,验证每个 dword,并在失败时恢复——但如果某次运行状态退化,请重启后再重试。值得保留的安全规则:每次写入前先读取,始终恢复你所修补的内容,绝不让注入的页表项保持生效,不要触碰 secure/TZ 物理内存(这是致命的),并通过重启来恢复退化状态。ROADMAP.md 列出了完整的注意事项清单及每项背后的证据。
ROADMAP.md 持久交接文档:已验证常量、流程、注意事项、开放路径
STATUS.md 当前状态 + 验证回执
src/ pa_leak.{c,h} · cheese.c · cheese_pa.c(主力:PROBE/POKE/SELFTEST/ROOT 模式)
call_capset.c · host_kallsyms.c(离线符号解析器)
scripts/ root-now.sh · patch-dwords.sh · demo-root.sh · verify-backup.sh
tools/ btf_offsets.py
固件镜像、OTA 包和设备日志被有意不提交(参见 .gitignore)。
GPLv3 — 参见 LICENSE。