从非特权 adb shell 出发,利用一个内核 CVE 对一台原厂、锁定 bootloader 的 Google Pixel 进行 root——无需解锁、无需刷机、无需厂商协助。
一个用户态可达的内核缺陷提供了短暂的读/写原语。该原语被用于将 KernelSU 模块延迟加载进正在运行的 GKI 内核,随后 root 权限被移交给已安装的任意 KernelSU 管理器。不写入任何分区,因此重启即为卸载。一切都在主机上通过 adb 经由单个可执行文件 ./pixel-ksu-root 运行。
| CVE | 缺陷 | 当前进展 |
|---|---|---|
| CVE-2026-43499 — GhostLock | 一次 futex PI 遍历跟随了一个 rt_mutex_waiter,而 remove_waiter() 将其悬空遗留,从 pselect(2) 重新占用的栈槽中读出 | 可 root,硬件验证;default 配方,因此裸跑即可触发 |
| CVE-2026-43049 — FFWheel | hidpp_probe() 在力反馈初始化之前就发布了输入设备,并在返回错误时未调用 hid_hw_stop(),因此一个已释放的 struct uhid_device 仍可通过 /dev/input/eventN 访问 | 可 root,硬件验证;从非特权 shell 的 use-after-free 到任意内核读/写,然后就地覆写自身的 cred |
| CVE-2026-93189 — Joyride | hid_hw_stop() 从不等待输入停止,因此一次失败的探测释放了 struct hidraw,而 hidraw_report_event() 仍在另一个处理器上向其写入 | 候选后继;从非特权 shell 通过 /dev/uhid 在硬件上走通了通往释放的路径,且在关闭上述两条链的构建上仍然开放 |
| CVE-2026-46242 — BadEpoll | __ep_remove() 清除了 file->f_ep 却继续使用该文件,因此并发的 __fput() 释放了它仍在写入的 eventpoll | 部分;读链和写链都能端到端运行,但跨 slab 边界的投递尚未解决 |
| CVE-2026-56945 — RogueWave | bigo_iommu_fault_handler() 在无锁情况下遍历驱动全局实例列表,基于对其调用者一个已有文档记载且错误的假设 | 无需特权即可通过公开的 AMediaCodec API 到达;故障处理函数本身尚未被进入 |
| CVE-2026-56914 — DirtyDock | gcip_iommu_mapping_unmap_buffer() 用无锁的 set_page_dirty() 而非其加锁变体弄脏一个已固定的 DMA 页,与后备内存的拆除过程竞争 | 可端到端触发,尽管设备节点受特权限制;两种竞争策略已被证伪,时序尚未赢得 |
| CVE-2026-64468 — Frostbind | binder_free_transaction() 在未持有引用的情况下解引用 t->to_proc | 搜寻;有漏洞的读取能运行,但竞争在裸机上失败 |
| CVE-2026-64469 — Frostwalk | Frostbind 的同类,位于同一函数中:binder_free_transaction() 的无锁读取与 binder_thread_release() 遍历另一个线程的 transaction_stack 相竞争 | 搜寻;释放和遍历均确认可达,机制中无 root 依赖——像 Shizuku 那样到达应用进程;一次无验证读取的回收尝试(洪泛 + 固定)尚未成功——写入的实际目标仍未被区分 |
| CVE-2026-64560 — Zombietick | 一个进程范围的 POSIX CPU 定时器在仍处于队列中时被释放,因为 posix_cpu_timer_del() 在 de_thread() 将 ->sighand 置空后提前返回 | 搜寻;KASLR 阶段成功,桥接描述符从未通过验证 |
| CVE-2026-49881 — Telecom | Telecom 信任调用者提供的组件名并用 CONTEXT_INCLUDE_CODE 加载它,因此一个诱饵应用可在 system_server 内运行任意 Java | 研究;这是用户态域转移而非内核缺陷,与 domainprobe/ 配对 |
| P0 465827985 — StackJump | 未构建 stack-clash 保护的原生代码让一个大栈帧跨过 system_server 线程的守护页 | 溢出可复现并可靠地使一个 binder 线程崩溃;报告者基于喷洒的写入则不能,因此实现的原语是对崩溃 tombstone 的读取——对该进程而言是一次完整的 ASLR 攻破 |
| CVE-2026-28594 — SealSlip | 一个未密封的 memfd 在期望 ashmem 的地方被接受,因此当消费者持有它时其大小仍可变 | 对非特权调用者仅构成拒绝服务,且受 SELinux 约束;保留用于该仪器 |
| CVE-2026-28662 — CookieJar | 一个 Wi-Fi Direct cookie 在仅有下界检查的情况下被复制进固定缓冲区,溢出 wpa_supplicant 堆 | 已记录,未追查;候选第一阶段 |
| CVE-2026-43284 — DirtyFrag | esp_input() 就地解密,因此序列字存储先于哈希检查落地,落在分片所固定的任意 page-cache 页中 | 已关闭;未修补但在任何特权下均不可利用,因为 skb_orphan_frags_rx() 会先复制分片 |
一条能 root 的链以 CAP_SU 移交结束。不能 root 的链则是一次搜寻:运行器对每次尝试进行分类和归档,而非报告成功,这正是某个缺陷在其利用仍属推测时保持有用的方式(runner/README.md §2.3)。一条链在能采用 default 配方之前必须证明什么,见 cves/README.md。
你需要已授权设备的 adb、一台处于受支持构建的原厂锁定 Pixel、一个已安装的 KernelSU 管理器——其 APK 提供匹配的 ksud 和 kernelsu.ko——以及在 artifacts/ 下构建好的载荷。
./pixel-ksu-root --manager me.weishu.kernelsu # one device, auto-detected
./pixel-ksu-root --serial 1A2B3C4D --manager me.weishu.kernelsu
./pixel-ksu-root --recipe zombietick # a hunt, not a root run
./pixel-ksu-root --recipe zombietick --print-contract --target panther-CP2A.260705.006
./pixel-ksu-root --help # flags and budgets