CVE-2026-98260(POSIX CPU 定时器释放后使用)的 Android 前端,与 CVE-2026-64560 属于同一类漏洞。只需轻点一下即可获得 root shell,随后延迟加载 KernelSU(u:r:ksu:s0)。
漏洞利用本身不包含在此处。本仓库是围绕它的应用外壳:UI、状态检测,以及从普通应用运行 shell 域漏洞利用所需的 Shizuku 管道。
应用以 untrusted_app 身份运行,无法读取 /sys/kernel/tracing,而漏洞利用需要该路径进行信息泄露和触发。因此 TimerRoot 会启动一个 Shizuku 用户服务,Shizuku 以 shell 用户(uid 2000、u:r:shell:s0)身份运行该服务。漏洞利用二进制文件在该进程内执行,因此它能获得与通过 adb shell 启动时相同的环境。
MainActivity (untrusted_app)
└─ Shizuku user service (uid 2000, u:r:shell:s0)
├─ extracts assets/timer to /data/local/tmp/timer
└─ runs it; on success keeps /system/bin/sh alive
minSdk 30),arm64Load KernelSU 路径6.12.69-android16-6-g242e1a07f878-ab15865446-4k;详见下文。TimerRoot 期望编译好的漏洞利用位于 app/src/main/assets/timer:
git clone https://github.com/YuKongA/CVE-2026-98260
cp CVE-2026-98260/timer/timer app/src/main/assets/timer
或
scripts/fetch-timer.ps1
该二进制文件由其作者以 MIT 许可证授权;仅在你拥有的硬件上使用它,并且仅当你的内核与它移植到的构建版本匹配时才使用。
打开项目并构建,或者:
./gradlew assembleDebug
该项目需要带有 platform 36 和 build-tools 36 的 Android SDK。Shizuku API 从 Maven 拉取(dev.rikka.shizuku:api)。
scripts/build.ps1 仅使用 SDK、javac、d8、aapt2 和 apksigner 来构建并签名 APK。它不内置任何依赖:它将应用与 Shizuku API 源码一起编译,因此请先克隆这些源码:
git clone https://github.com/RikkaApps/Shizuku-API
scripts/build.ps1 -Sdk "C:\Users\<you>\AppData\Local\Android\Sdk"
Shizuku 必须在 TimerRoot 执行任何操作之前处于运行状态:它正是为漏洞利用所需的 shell 用户提供支持的那个进程。Shizuku 在每次重启后都会停止,因此这是每次都要做的第一步。
无线调试(首次配对后无需 PC)
通过 USB
在手机已连接且 USB 调试已授权的情况下:
adb shell sh /sdcard/Android/data/moe.shizuku.privileged.api/start.sh
较新版本的 Shizuku 可能不再附带该脚本;如果该脚本缺失,请使用上文的无线调试方式。
检查服务器是否已启动:
adb shell ps -A | grep shizuku_server
# shell 12345 1 ... shizuku_server
ps 仅显示 moe.shizuku.privileged.api 意味着管理器应用已打开,但
服务器未运行;在服务器运行之前,漏洞利用无法启动。
未连接,请在工具行中按 Shizuku 再次请求。Prepare 将 assets/timer 解压到 /data/local/tmp/timer:
installed 307192 bytes
一键操作。应用完成提权,在服务中保留一个 uid=0 的 shell,随后自动启动 KernelSU 延迟加载:
[child] woke uid=0
root shell ready - loading KernelSU...
Loading KernelSU... 12s
KSU_LOADED
卡片会进入 Root shell -> Jailbreak mode(u:r:ksu:s0)。如果
KernelSU 阶段竞争失败,卡片会变红并显示 KernelSU failed,此时
应先重启再重试。
使用 Reboot 按钮。它通过服务(svc power reboot)执行,因此即使
尚未打开 root shell 也能工作。重启也是清除驻留进程和卸载 KernelSU 的
唯一干净方式。
重启后,从第 1 步重新开始:Shizuku 已停止,KernelSU 已消失。
状态卡片反映实际运行状态,通过运行
su -c id 并检查 u:r:ksu:s0 来检测:
| 卡片 | 含义 |
|---|---|
| Not connected | Shizuku 未运行 / 未绑定 |
| Ready | Shizuku 已连接,尚无 root |
| Root shell | uid=0,u:r:shell:s0 |
| Jailbreak mode | KernelSU 已加载,su 在 u:r:ksu:s0 中可用 |
KernelSU failed 和 base calibration failed伪造凭据阶段需要内核线性映射基址,漏洞利用会从 page-alloc 跟踪事件中 推导该基址。它假定使用 4 KB 页:
[base] made=512 best=0 count=0
[-] base calibration failed
检查设备的分页大小:
adb shell getconf PAGE_SIZE
4096:布局因其他原因而不同;请收集 uname -r、设备型号和完整日志,并向上游报告。16384:该漏洞利用无法在出厂状态的此设备上生效。必须针对 16 KB 页面重新构建(页移位、掩码和阶数大小),这属于移植工作,而非应用设置。root shell 在此类设备上仍可成功,因为该路径只需要泄露的凭据地址,而不需要线性映射基址。
Not connectedShizuku 未运行。请重新启动它(每次重启后都会停止),并参见步骤 1。
Prepare 未报告任何内容可能有系统对话框覆盖了应用(Shizuku 配对、OPPO 安装程序扫描)。请关闭它,然后再次按下 Prepare。
这是一个内核漏洞利用。按下任何按钮之前请先阅读本节。
app/src/main/java/com/kpgc/timerroot/MainActivity.java UI and state
app/src/main/java/com/kpgc/timerroot/UserService.java runs as the shell user
app/src/main/aidl/com/kpgc/timerroot/IUserService.aidl service interface
app/src/main/assets/timer exploit binary (not in git)
scripts/build.ps1 Gradle-free build
本仓库中的应用代码采用 MIT 许可证。漏洞利用二进制文件和 Shizuku API 保留各自的许可证。