JoinChang/ghostlock-oneplus
GitHub: JoinChang/ghostlock-oneplus
GhostLock 是针对锁定 Bootloader 的 OnePlus 设备的内核漏洞(CVE-2026-43499)利用工具,无需解锁即可实现 root 并安装 KernelSU。
Stars: 2 | Forks: 0
# GhostLock — OnePlus 锁定 Bootloader 越狱
针对 Bootloader 已锁定的 OnePlus 设备的内核漏洞利用。无需解锁 Bootloader 或修改 boot image 即可实现 root + KernelSU 安装。支持运行时自动检测内核版本,并内置多设备偏移量表。
## 漏洞
**CVE-2026-43499** — Futex PI (Priority Inheritance) Use-After-Free
影响 Linux kernel 2.6.39 ~ 7.1。已在 mainline 7.1(commit `3bfdc63936dd`)中修复。Android GKI 6.12.x 仍然存在此漏洞。
`pselect6` 系统调用会将 `fd_set` 数据复制到内核栈上。当其与 futex PI waiter 机制结合时,已释放的栈帧会被作为 `rt_mutex_waiter` 结构体重新回收利用。随后,在 PI 链遍历期间的红黑树重平衡操作会将受控的值写入到任意内核地址中。
## 已测试设备
| 设备 | SoC | 操作系统 | 内核 | 状态 |
|--------|-----|-----|--------|--------|
| OnePlus Ace 6T | SM8845 (Snapdragon 8s Elite) | Android 16, ColorOS 16.0.2.403 | `6.12.38-...-ab14275539` | **已验证** |
| OnePlus Ace 6T | SM8845 (Snapdragon 8s Elite) | Android 16, ColorOS 16.0.8.301 | `6.12.38-...-ab14552068` | **已验证** |
### 未测试(已提取偏移量,未在设备上验证)
| 设备 | 内核 | 备注 |
|--------|--------|-------|
| OnePlus 15 | `6.12.23-...-ab14541642` | 从 OTA boot.img 提取的偏移量 |
其他拥有相同 SoC 系列且运行 Android 16 / kernel 6.12.x 的 OnePlus 设备,应该可以通过提取其 `boot.img` 中的偏移量来进行适配。
## 漏洞利用流程
```
Write 1 (mode=1) → SELinux enforcing = 0
(low byte of kernel ptr = 0x00)
Write 2 (mode=2) → task->cred = init_cred
(uid=0, all capabilities)
Root shell → ksud late-load (KernelSU LKM)
→ su -c load_policy (fix SELinux policycap)
→ dynamic manager registration
```
### 引导模式(手机独立运行)
```
App (seccomp) → Write 1 (no perf needed)
→ mini-adb connect TCP 5555 (RSA auth)
→ adb shell: full exploit (perf works, no seccomp)
→ root → KSU → network fix
```
### 自动启动(通过 ReSukiSU 集成)
```
BOOT_COMPLETED → BootCompletedReceiver
├─ su available → skip (soft reboot / already rooted)
└─ no root → GhostlockService → setsid exploit --bootstrap
```
## 关键技术细节
### 运行时内核匹配
偏移量以 `uname -r` 为键存储在 `offsets.h` 的查找表中。漏洞利用程序在启动时会自动选择匹配的配置,并拒绝在未知的内核上运行。
```
static const struct kernel_offsets known_offsets[] = {
OFFSETS_ENTRY("6.12.38-android16-5-g8c67d4274c0a-ab14275539-4k", ...),
OFFSETS_ENTRY("6.12.38-android16-5-g844001fb8721-ab14552068-4k", ...),
OFFSETS_ENTRY("6.12.23-android16-5-gb2a876903b49-ab14541642-4k", ...),
{ .uname_r = NULL }
};
```
### perf_find_task 修复(kernel 6.12)
```
// Bug: bit 32 invalid on ARM64 → kernel rejects REGS_INTR
pe.sample_regs_intr = (1ULL << 33) - 1; // BROKEN — 24-byte samples, no regs
// Fix: bits 0-31 only (x0-PC)
pe.sample_regs_intr = (1ULL << 32) - 1; // WORKS — 280-byte samples with regs
```
### 写入 2 mode=2
```
// mode=1: writes slab address to cred → UAF panic (~50%)
do_one_write(target, "W2: cred", 1); // BROKEN
// mode=2: writes data_addr(INIT_CRED) → valid pointer, zero panic
do_one_write(target, "W2: cred", 2); // WORKS
```
### 迷你 ADB 客户端
为引导模式内置了 ADB 协议实现 (`miniadb.c`):
- TCP 连接到 localhost:5555
- 通过 `dlopen(libcrypto.so)` 进行 RSA 身份验证
- 执行 Shell 命令,不受应用 seccomp 限制
### SELinux 网络修复
Write 1 会破坏 `selinux_state` 中超出 `enforcing` 范围的字节,从而导致 `netif egress` 权限失效。可通过在漏洞利用完成后,从 KSU 的 `su` 上下文中运行 `load_policy` 来修复此问题。
## 编译
```
NDK=/path/to/android-ndk
$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android35-clang \
-O2 -Wall -Isrc -DTARGET_CONFIG_H="targets/ace6t/target.h" \
src/targets/ace6t/main.c src/targets/ace6t/util.c src/slide.c \
src/targets/ace6t/fops.c src/pipe.c src/root.c \
src/targets/ace6t/miniadb.c \
-o ghostlock -fPIE -pie -pthread
```
## 前置条件
### ksud(安装 KSU 必需)
GhostLock 仅提供 root 权限。KernelSU 的安装依赖于 **ksud** —— 这是一个为每个 KMI 版本内置了相应 `kernelsu.ko` 模块的二进制文件。root 脚本会在设备上查找 ksud,并调用 `ksud late-load --kmi android16-6.12`。
| 方法 | 步骤 |
|--------|-------|
| **ReSukiSU APK**(推荐) | 安装 [ReSukiSU](https://github.com/ReSukiSU/ReSukiSU) 或这个 [fork](https://github.com/JoinChang/ReSukiSU)。官方发布版本会内置 `libksud.so`。 |
| **CI 发布版本** | 从 [ReSukiSU CI](https://github.com/cctv18/ReSukiSU_CI/releases) 下载 `ksud-aarch64-linux-android.zip` |
## 设置(仅一次)
```
adb tcpip 5555
adb push ~/.android/adbkey /data/local/tmp/a/adbkey
adb push ghostlock /data/local/tmp/a/e && chmod 755 /data/local/tmp/a/e
```
首次越狱成功后,系统会通过 `resetprop` 设置 `persist.adb.tcp.port=5555` —— 随后的每次启动都将完全自动化。
## 用法
```
/data/local/tmp/a/e # Full exploit (adb shell)
/data/local/tmp/a/e --bootstrap # Phone standalone (app context)
/data/local/tmp/a/e --write1 # SELinux disable only
```
## 添加新设备 / 内核版本
只需提供 `boot.img` —— 无需 root 权限,也不需要设备访问权限。
### 从 boot.img 中提取偏移量
```
# 1. 提取 kernel
python -c "import struct; d=open('boot.img','rb').read(); open('kernel','wb').write(d[4096:4096+struct.unpack_from('
标签:Android, DSL, KernelSU, Web报告查看器, 内核提权, 安全, 客户端加密, 超时处理, 越狱, 逆向工具