这是 JoinChang/ghostlock-oneplus 针对 CVE-2026-43499 的仅写1次提取。它会在已锁定引导加载程序的支持且存在漏洞的 OnePlus 内核上禁用 SELinux enforcing,并且不执行任何其他操作:不覆盖凭证、不提供 root shell、不安装 KernelSU、不执行引导程序,也不泄漏 KASLR。
CVE-2026-43499 是 Linux 内核 futex PI 重排路径中的一个 rtmutex 释放后使用漏洞。在代理锁回滚期间,remove_waiter() 对 current 而非等待者的任务进行操作,导致等待者的 pi_blocked_on 指针悬空。该漏洞已在 Linux 6.12.86 及更高版本的 6.12 发行版中于上游修复。
单个子节点 PI 写入:
fake_right = base + 0x100 -> byte0 = 0 (enforcing), byte1 = 1
它复用了完整漏洞利用的堆喷射 + pselect PI 路径,但绕过了 KASLR(kaslr_slide = 0)。最多重试 20 次(每次尝试之间会进行 slab 排空),一旦 /sys/fs/selinux/enforce 读取为 0 即退出。
共享的原语(util.c 堆喷射、fops.c pselect 路径、kernelsnitch 和偏移量表)被保留。
参见 src/devices/offsets.h,以 uname -r 为键:
6.12.38-android16-5-...-ab14275539-4k6.12.38-android16-5-...-ab14552068-4k6.12.23-android16-5-...-ab14541642-4k(仅偏移量,未验证)make # 使用 /opt/android-ndk(或 $ANDROID_NDK_HOME)
生成 selinux_disabler,一个适用于 Android API 35 的 aarch64 PIE。
adb push selinux_disabler /data/local/tmp/a/e && chmod 755 /data/local/tmp/a/e
adb shell /data/local/tmp/a/e
验证:
adb shell cat /sys/fs/selinux/enforce # -> 0
仅需要 boot.img。使用上游项目 tools 目录 中的提取工具,然后在 src/devices/<device>/offsets.h 中添加条目,并从 src/devices/offsets.h 中 #include 该文件。
仅用于授权的安全研究和教育目的。
| 移除项 | 原因 |
|---|
slide.c | KASLR SLIDE 泄漏 — 不需要(slide = 0) |
pipe.c | 基于管道的物理读/写 — 仅用于 CFI/root 阶段 |
root.c | 凭证修补 / install_android_root — 仅写 2 次 |
miniadb.c | 引导程序 mini ADB 客户端 — 未使用 |
try_cfi_stage、install_child_root、repair/refresh/leak/restore 辅助函数 (fops.c) | CFI / KASLR 泄漏 / 管道物理读写阶段 — 在自定义写入路径上从未到达 |
perf_find_task、spawn_child、write_root_script、run_exploit、run_bootstrap (main.c) | 写 2 次(凭证 → init_cred)、root shell、KSU、引导程序 |