RMV Exploit — 针对 iQOO Neo 11 (PD2520) 的 CVE-2026-43499 纯净构建
boxiaolanya2008/CVE-2026-43499-Neo11Plus 的分支,
针对 RootMyVivo Neo 重构:移除了所有我们场景不需要的内容,
保留了经过验证的漏洞利用核心,未改动时序。
相对上游移除的内容
| 组件 | 原因 |
|---|
| 更换壁纸 + 杀死 system_server | root 后“自发”软重启和壁纸更换的主要来源 |
| io 守护进程(端口 39555) | 仅调试用 kernelapp 需要;应用通过 su 工作 |
| /apex/com.android.virt/bin 上的 tmpfs 覆盖层 | 软重启时可能挂起 zygote/system_server(黑屏) |
| 在 adbd 的 mount-namespace 中安装 su | 应用通过完整路径调用 /data/local/tmp/su |
| 启动服务 10-neo11-su.sh | 固化由应用完成:persist.adb.tcp.port + adb_keys + ksud |
| 其他设备的偏移表 | 仅 PD2520-BP2A.250605.031.A3 |
| kernelapp (app/) | 已由应用功能替代 |
保持不变的内容
- 漏洞利用核心:futex PI UAF → pselect fake lock route → heap spray →
pipe physrw → root(时序、线程、reclaim 策略——与经过验证的构建一致)
- posture:
panic_on_oops=0、panic_on_warn=0(防 panic),
kptr_restrict/dmesg_restrict、AVC 投毒(permissive 且不破坏 policycap)
- su 守护进程:客户端二进制 + 带 unix socket 的守护进程、PTY 交互、
当 KernelSU
/system/bin/su 出现时转发到它
安装 su(我们的方案)
漏洞利用会放置 /data/local/tmp/su(0755,root:root,system_file context)
并启动带 socket /data/local/tmp/temp_su.sock 的守护进程。
应用通过完整路径调用 su——完全不触碰 /apex。
构建(在设备上,Termux)
cd exploit
PATH=/data/data/com.termux/files/usr/bin:$PATH \
make HOST_CLANG=/data/data/com.termux/files/usr/bin/clang \
NDK_ROOT=/root/android-sdk/ndk/26.1.10909125
- Termux clang-21(aarch64,android 主机)+ NDK r26 sysroot——NDK 包装器
在设备上无法运行 x86_64,而 sysroot 在架构上无关
- API 34:NDK r26 中没有 35 目录,在 35 下 lld 会静默地从根目录取静态
libc.a(7 MB,且 .so 内含 bionic)
- 输出:
build/PD2520-BP2A.250605.031.A3/bin/preload.so(约 140 KB)
和 build/embed/su_daemon_aarch64_pie(su,约 11 KB)
运行时环境要求
- 内核
6.6.89-android15-8-g1f71897ac249-abogki467805059-4k(偏移来自
此 boot.img 的 kallsyms+BTF;更换内核 = 重新生成 target.h)
- 从 shell 域(adb)启动:
cd /data/local/tmp/rmv && LD_PRELOAD=$PWD/preload.so /system/bin/true
稳定化层(v2)
在上游之上新增的内容
通过环境变量配置
RMV_ATTEMPTS=N — 完整尝试次数(默认 3)
RMV_RETRY_DELAY=N — 尝试之间的暂停秒数(默认 8)
NEO11_* — 上游开关(delay/nice/attempts)已保留
panic 从何而来(分析)
- 时序失败 — CONFIG_INIT_STACK_ALL_ZERO 会覆盖栈:fake
waiter 在触发前被销毁 → 基于垃圾节点的 rb-tree rebalance → oops。
通过 quiesce + retry 缓解(上游只有一次机会)。
- 向垃圾地址写入 — 在失败的 reclaim pipe_buffer 之后,
扫描会找到虚假目标。cred-guard 会拦截最危险的情况。
- 原厂 panic_on_oops=1 — 任何 oops = 重启。posture
会在 root 后立即设为 0,但在 root 之前唯一的防护就是谨慎。