fuukliam/vivo-x-fold6-ghostlock
GitHub: fuukliam/vivo-x-fold6-ghostlock
该项目研究将 CVE-2026-43499(GhostLock)内核漏洞 exploit 移植到 vivo X Fold6 设备,目前卡在 KASLR slide 绕过阶段。
Stars: 0 | Forks: 0
# vivo X Fold6 (V2545A) — GhostLock 临时 root 研究
## 项目状态
| 项目 | 状态 |
|------|------|
| 漏洞检测 | ✅ CVE-2026-43499 存在,内核 6.12.58 < 6.12.86 |
| boot.img 获取 | ✅ 已从 OTA 全量包提取当前系统内核 |
| 偏移量计算 | ✅ vmlinux.elf 转换成功,nm 提取全部符号 |
| target.h | ✅ 精确偏移量,100% 匹配 g0a092cc0037a |
| preload.so 编译 | ✅ NDK r29 编译成功 |
| KASLR slide | ❌ 卡住 — vmlinux-to-elf 无法恢复完整 slide 逻辑 |
| 临时 root | ❌ 未实现 |
## 设备信息
型号: vivo X Fold6 (V2545A / PD2545)
CPU: 天玑 9500 超能版 (Dimensity 9500 Super), SoC: mt6993, 8核
RAM: 12GB LPDDR5X Ultra
ROM: 256GB UFS 4.1
OS: Android 16 (API 36) + OriginOS 6 Fold
Build: BP2A.250605.031.A3_V000L1 / PD2545_A_16.0.14.15.W10
内核: 6.12.58-android16-6-g0a092cc0037a-abogki521987229-4k
SELinux: Enforcing
ADB: platform-tools 37.0.1
## 漏洞原理
CVE-2026-43499 (GhostLock) 是 Linux 内核 futex PI (Priority Inheritance) 子系统中的一个 use-after-free 漏洞。
**NebuSec IonStack exploit 利用链**:
1. futex PI chain 设置 (waiter/owner/consumer 三线程)
↓
2. FUTEX_CMP_REQUEUE_PI → waiter 被移出原链 → 栈上 waiter 结构体变 stale
↓
3. pselect() 调用 → 内核将 fd_set 从用户态拷贝到内核栈
↓ (期望 fd_set 重叠覆盖 stale waiter)
4. 栈上的 fake waiter 包含构造的内核地址 (nfulnl_logger 等)
↓
5. 读 /proc/sys/kernel/random/boot_id → 若泄漏内核指针 → 算出 KASLR 基址
↓
6. 建立 pipe-physrw 读写原语 → commit_creds(prepare_kernel_cred(0)) → uid=0
## 当前卡点:KASLR Slide 失败
### 症状
[+] build config label=v2545a_16.0.14.15 slide=pselect main=pselect
[+] p0 profile ...
[+] slide child context route=pselect pid=XXXXX
→ exit code 255 (安全退出,未提权)
boot_id 输出为正常 UUID 格式,不包含内核指针,证明 pselect 的 fd_set 栈覆盖**完全没有生效**。
### 根因分析
NebuSec 的 slide 机制依赖 pselect 的 fd_set 拷贝恰好覆盖到栈上已释放的 futex PI waiter 结构体。这个重叠位置是**内核版本和编译选项相关**的:
| 内核 | slide 状态 |
|------|-----------|
| Pixel GKI 6.1 (NebuSec 默认) | ✅ fd_set 与 waiter 精确重叠 |
| Pixel 10 GKI 6.12 (tokay) | ✅ 使用 `PSELECT_WAITER_WORD_SHIFT=1` 微调 |
| vivo X Fold5 (6.1, 骁龙) | ❌ 博客证实失败 |
| vivo X Fold6 (6.12, 天玑9500) | ❌ **本文研究对象** |
### 已尝试的修复方向
| 方向 | 结果 |
|------|------|
| 精确偏移量 (nm/vmlinux-to-elf) | ✅ 偏移量 100% 正确,但 slide 仍失败 |
| NFDS 调整 (256 → 320) | ❌ waiter words 放不下 / 不重叠 |
| pselect sigmask 参数 | ❌ sigmask 加在不同栈帧,未移动 fd_set |
| WORD_SHIFT 暴力测试 (-5~7) | ⚠️ -5/-4/2 导致 kernel panic,其余安全退出 |
| 反汇编静态分析栈深度 | ❌ BOLT+LTO 优化导致函数被肢解,难以追踪 |
## 仓库结构
├── README.md # 本文档
├── exploit/
│ ├── slide.c # 修改后的 slide.c (支持运行时 SLIDE_SHIFT)
│ └── targets/
│ └── xfold6-mt6993/
│ └── target.h # X Fold6 精确偏移量配置 (含 _OFF 和 _IMAGE)
├── scripts/
│ ├── kernel_stack_analyzer.py # 内核栈深度分析脚本
│ └── bruteforce_wordshift.sh # WORD_SHIFT 暴力测试脚本
├── notes/
│ └── findings.md # 完整研究笔记和时间线
└── artifacts/
└── offsets.txt # 内核符号偏移量清单
## 依赖
本仓库不包含 NebuSec 原始 exploit 的全部源码,仅包含我们修改和新增的文件。使用前需要先克隆原始仓库:
# 1. 克隆 NebuSec 原始 exploit
git clone --depth 1 https://github.com/NebuSec/CyberMeowfia.git
cd CyberMeowfia/IonStack/CVE-2026-43499/exploit
# 2. 将本仓库的文件覆盖到对应位置
# - slide.c → src/slide.c
# - target.h → src/targets/xfold6-mt6993/target.h
cp /path/to/this/repo/exploit/slide.c src/
mkdir -p src/targets/xfold6-mt6993
cp /path/to/this/repo/exploit/targets/xfold6-mt6993/target.h src/targets/xfold6-mt6993/
# 3. 编译
export ANDROID_NDK_HOME="$HOME/android-ndk-r29"
export NDK_ROOT="$ANDROID_NDK_HOME"
export NDK_TOOLCHAIN="$NDK_ROOT/toolchains/llvm/prebuilt/darwin-x86_64"
make clean && make PROJECT=xfold6-mt6993 API=35
# 输出: build/xfold6-mt6993/bin/preload.so
## 测试方法
# 推送
adb push preload.so /data/local/tmp/
# 测试 (默认 shift=0)
adb shell "LD_PRELOAD=/data/local/tmp/preload.so /system/bin/id"
# 测试带 WORD_SHIFT
adb shell "SLIDE_SHIFT=1 LD_PRELOAD=/data/local/tmp/preload.so /system/bin/id"
## 安全说明
- **临时 root**: 不改分区,重启即失,0 变砖风险
- **永久解锁 BL**: 需额外刷写 lk.bin + misc 分区,有风险,本仓库不提供
- 本仓库仅用于安全研究和学习目的
## 致谢
- [NebuSec / VEGA Team](https://github.com/NebuSec/CyberMeowfia) — 发现 CVE-2026-43499 并公开 exploit
- [xuanyuan-blog](https://www.xuanyuan-blog.top/2026/07/13/Porting-IonStack-to-the-vivo-X-Fold5/) — vivo X Fold5 移植经验
- Google kernelCTF — $92,337 bounty
标签:Android提权, futex, vivo, Web报告查看器, 云资产清单, 内核漏洞, 客户端加密, 应用安全, 目录枚举, 移动安全, 逆向工具, 逆向工程