Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
GhostLock-for-OnePlus15T — (CVE-2026-43499)内核漏洞利用程序,适用于未解锁 Bootloader 的一加15T. | Kitploit
工具/GitHubGitHub/cuteaplane/ghostlock-for-oneplus15t
Android安全权限提升漏洞分析漏洞利用移动安全Payload 开发二进制利用
GitHubcuteaplane/ghostlock-for-oneplus15t

GhostLock-for-OnePlus15T

(CVE-2026-43499)内核漏洞利用程序,适用于未解锁 Bootloader 的一加15T.

查看仓库
1211132个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

GhostLock — OnePlus 15T

English

适用于 OnePlus 15T 锁 Bootloader 设备的内核漏洞利用工具。利用 CVE-2026-43499 在不解锁 Bootloader、不修改 boot.img 的前提下获取 root 权限。

仅限授权的安全研究和教育用途。

本仓库修改自 GhostLock-for-OnePlus 源仓库,专门适配 OnePlus 15T (PLZ110 / SM8850 / 骁龙 8 Elite) 的物理内存布局和 CPU 时序。


目录

  • 漏洞概述
  • 支持设备
  • 前置条件
  • 构建方法
  • 使用方式
  • 运行模式
  • 技术细节
  • 文件结构
  • 适配新设备
  • 常见问题

漏洞概述

项目内容
CVECVE-2026-43499
类型Futex PI(优先级继承)Use-After-Free
影响范围Linux 内核 2.6.39 ~ 7.1
修复版本主线内核 7.1(commit 3bfdc63936dd)
Android 状态GKI 6.12.x 仍未修复

漏洞原理

pselect6 系统调用会将 fd_set 拷贝到内核栈上。当与 futex PI waiter 机制结合时,释放后的栈帧可以被重新分配为 rt_mutex_waiter 结构体。在 PI 链遍历过程中,红黑树(rb-tree)重平衡操作会向任意内核地址写入可控数据,从而实现任意内核地址写入原语。

利用链

futex PI UAF (CVE-2026-43499)
  ├─ 伪造 rt_mutex_waiter 对象
  ├─ 通过 pselect/select fd_set 布局控制内核栈
  ├─ 触发 rt_mutex PI 操作执行任意写入
  ├─ Write 1: selinux_state.enforcing = 0
  └─ Write 2: cred → init_cred (uid=0, full capabilities)

支持设备

设备代号SoC内核版本固件状态
一加 15TPLZ110SM8850 (骁龙 8 Elite)6.12.38-android16-5-g844001fb8721-ab14552068-4kColorOS 16.0.9.400✅ 已验证

Ace6T和一加15,请见原仓库。

前置条件

ksud(KernelSU 安装必需)

GhostLock 只负责提权。KernelSU 的安装依赖 ksud(内含各 KMI 版本的 kernelsu.ko):

获取方式说明
ReSukiSU APK(推荐)安装 ReSukiSU,APK 捆绑了 libksud.so
CI 发行版从 ReSukiSU CI 下载 ksud-aarch64-linux-android.zip

没有 ksud 时,利用仍可获得 uid=0 的 root shell,但 KernelSU 不会被安装,su 不会持久化。


构建方法

依赖

  • Android NDK(r25+)
  • 设置环境变量 ANDROID_NDK_HOME 或 ANDROID_NDK_ROOT

编译

# 默认编译 (API 35)
make

# 指定 API 级别
make API=34

# 指定 NDK 路径
NDK=/path/to/android-ndk make

产物

编译后生成 ghostlock — 静态链接的 ARM64 ELF 可执行文件。


使用方式

一次性设置

# 1. 启用 ADB TCP 模式
adb tcpip 5555

# 2. 推送 ADB 密钥(bootstrap 模式需要)
adb push ~/.android/adbkey /data/local/tmp/a/adbkey

# 3. 推送利用程序
adb push ghostlock /data/local/tmp/a/e
adb shell chmod 755 /data/local/tmp/a/e

首次成功后,resetprop 会自动设置 persist.adb.tcp.port=5555,后续重启可全自动运行。


运行模式

完整利用(ADB shell 环境)

/data/local/tmp/a/e
  • perf 可用,能精确泄露子进程 task_struct 地址
  • 两阶段写入:W1 关 SELinux → W2 提权 → 加载 KernelSU

Bootstrap 模式(App 上下文,有 seccomp 限制)

/data/local/tmp/a/e --bootstrap
  1. Write 1 → 关闭 SELinux
  2. 利用 SELinux 关闭后的权限执行 setprop 启用 ADB TCP 5555
  3. 内置 Mini ADB 客户端通过 127.0.0.1:5555 回连
  4. 使用预推送的 RSA 密钥完成 ADB 认证
  5. 在 ADB shell(无 seccomp 限制)下执行完整利用

仅 Write 1(只关闭 SELinux)

/data/local/tmp/a/e --write1
  • 最多尝试 20 次
  • 可用于调试或需要临时关闭 SELinux 的场景

技术细节

1. 运行时内核匹配

偏移量存储在 src/devices/offsets.h 的查找表中,以 uname -r 为键。程序启动时自动匹配,未知内核直接拒绝运行。

static const struct kernel_offsets known_offsets[] = {
  OFFSETS_ENTRY("6.12.38-android16-5-...-ab14275539-4k", ...),
  OFFSETS_ENTRY("6.12.38-android16-5-...-ab14552068-4k", ...),
  OFFSETS_ENTRY("6.12.23-android16-5-...-ab14541642-4k", ...),
  { .uname_r = NULL }  /* 哨兵 */
};

偏移来源

类型数量提取方式
全局符号偏移(kallsyms)28tools/extract_target.py
结构体字段偏移(BTF)57tools/extract_btf.py
推导值9自动计算
固定常量12无需提取

BTF 验证的结构体

结构体字段数用途
task_struct17进程描述符、cred、seccomp
rt_mutex_waiter6UAF 伪造结构体
cred4用户凭证、capabilities
seccomp3seccomp 过滤状态
pipe_inode_info11管道缓冲区操作
file_operations13伪文件操作表
mm_struct1内存描述符 owner

2. KASLR 绕过

SLIDE 模式 — boot_id 泄露

当内核指针被限制读取时(kptr_restrict),利用 boot_id 被内核地址覆写的特性泄露基址:

读取 /proc/sys/kernel/random/boot_id
  └─ UUID 中被覆写为 nfulnl_logger 地址
      └─ 计算 KASLR slide = leaked_addr - image_offset
          └─ 得到 kaslr_base

FOPS/CFI 模式 — 文件操作表泄露

当有 ashmem 设备访问权限时,通过 configfs 读写原语读取 ashmem 的 fops 表,从中提取函数指针计算 KASLR 偏移:

打开 ashmem 设备
  └─ 读取 fops 表中的 open / ioctl / mmap 等函数指针
      └─ 与 image 基址偏移对比 → 得到 kaslr_base

3. 内核堆喷射

在 order-3(32KB)大页上布置伪造内核对象:

  • 伪造 file_operations 表 — 劫持 ashmem 设备的 miscdevice fops 指针
  • 伪造 rt_mutex_waiter — 模拟 PI 链上的 waiter 节点
  • 伪造 task_struct — PI 链遍历中的 task 引用
  • 伪造 rt_mutex(锁) — 正确的锁等待者和所有者信息

堆喷射通过 SKB(socket buffer) + KernelSnitch 实现:

  • KernelSnitch — 利用 futex 哈希碰撞泄露 mm_struct 地址,辅助堆风水
  • SKB 喷射 — 通过 sendmsg 填充内核堆

4. 物理内存读写(Pipe)

获取 KASLR base 后,利用管道缓冲区实现物理地址级别读写:

1. 定位管道缓冲区在 physmap 中的位置
2. 伪造 pipe_buffer 操作表指向已知的 pipe_buf_ops
3. 劫持 pipe_buffer 的 page 字段指向目标物理地址
4. 通过 pipe read/write 实现任意物理地址读写

支持操作:pipe_read64、pipe_write64、pipe_phys_read_data、pipe_phys_write_data

5. 两阶段写入

Write 1 — 关闭 SELinux

目标: selinux_state.enforcing (offset 0x00)
方式: child-node PI 写入 → 伪造 waiter 的 __rb_parent_color
      指向 selinux_enforcing - 8,rb-tree 重平衡时写入 0x00

SELinux 关闭后,setprop 等受 SELinux 限制的操作不再被阻止。

Write 2 — 提权到 root

目标: 子进程的 cred 指针
方式: 1. fork 子进程 → perf_find_task() 定位 task_struct
      2. 计算 cred 字段偏移
      3. child-node PI 写入 → cred = init_cred (uid=0, full caps)
      4. 清除 seccomp (TIF_SECCOMP + seccomp 结构体清零)

写完 cred 后还会进行 capability 回读验证,确保写入生效。

6. 内置 Mini ADB 客户端

src/core/miniadb.c — 用于 bootstrap 模式的精简 ADB 协议客户端:

1. TCP 连接 127.0.0.1:5555
2. A_CNXN → 连接请求 (version + max payload + host::
3. A_AUTH → 收到 RSA token 挑战
4. dlopen("libcrypto.so") → PEM_read_bio_RSAPrivateKey → RSA_sign
5. A_AUTH (AUTH_SIGNATURE) → 签名响应
6. A_CNXN → 连接建立
7. A_OPEN "shell:/data/local/tmp/a/e" → 执行完整利用

支持 SHA-1 和 SHA-256 两种签名算法。


文件结构

ghostlock-oneplus/
├── Makefile                        # 构建配置 (NDK 交叉编译)
├── README_CN.md                    # 说明文档
├── src/
│   ├── core/                       # 核心利用代码
│   │   ├── main.c                  # 入口:两阶段写入 + root shell
│   │   ├── fops.c                  # FOPS/CFI 模式:pselect 路由、PI 写入、KASLR 泄露
│   │   ├── util.c                  # 工具函数:堆喷射、KASLR 地址计算、内核 R/W 原语
│   │   ├── slide.c                 # SLIDE 模式:boot_id KASLR 泄露 + pselect 路由
│   │   ├── pipe.c                  # 管道缓冲区物理内存读写 (physrw)
│   │   ├── root.c                  # cred 覆盖、seccomp 清除、root 子进程管理
│   │   ├── miniadb.c              # 内置 ADB 客户端 (TCP + RSA 认证)
│   │   ├── common.h               # 全局宏、结构体定义、函数声明、常量
│   │   ├── target.h               # 目标设备内存布局 / 结构体偏移 / KASLR 参数
│   │   ├── offset.h               # 编译时 target config 桥接 (#include TARGET_CONFIG_H)
│   │   └── kernelsnitch/          # KernelSnitch — mm_struct 地址泄露
│   │       ├── kernelsnitch.h     # 核心算法:futex 哈希碰撞 + 暴力搜索
│   │       ├── futex_hash.h       # futex 哈希函数
│   │       ├── timeutils.h        # CPU 时间戳测量 (RDTSC)
│   │       └── utils.h            # 辅助宏 (pr_info / SYSCHK / ASSERT 等)
│   └── devices/                   # 设备偏移表
│       ├── offsets.h              # 聚合所有设备偏移 (查找表 + 哨兵)
│       ├── ace6t/offsets.h        # 一加 Ace 6T & 15T 偏移 (2 个内核版本)
│       └── op15/offsets.h         # 一加 15 偏移 (1 个内核版本)
└── tools/                         # 偏移提取工具链
    ├── extract_target.py          # 从 kallsyms 提取全局符号偏移 (28 个)
    └── extract_btf.py             # 从 BTF 提取结构体字段偏移 (57 个)

核心模块说明

下载工具