针对运行 Android 16 / GKI 6.12 的三星 Galaxy A17 SM-A175F 上 CVE-2026-43499("GhostLock") 的完整 user-to-root(用户到 root)漏洞利用链。
该利用链从公开的 GhostLock 原语开始,并以一个 usermode helper 结束,该 helper 以如下身份执行:
uid=0(root) gid=0(root) groups=0(root)
context=u:r:kernel:s0
它还通过 g4d / g4sh 启动一个每次启动均持久化的 root shell,并在不触发内核 panic 的情况下退出。
📖 完整技术文章:
https://www.mobilehackinglab.com/blog/cve-2026-43499-ghostlock-a17-root-shell
研究说明
我们并未发现 CVE-2026-43499。原始漏洞与 IonStack 研究的功劳归属于 Nebula Security。
本仓库记录了我们独立移植到三星 Galaxy A17 的过程、为应对三星内核防护机制所需的改动,以及一个新的最终利用阶段。
仅用于授权的安全研究与教育目的。
| CVE | CVE-2026-43499 — "ghostlock" |
| 设备 | 三星 Galaxy A17 (SM-A175F, mt6789) |
| GPU | Mali-G57 |
| 内核 | 6.12.23-android16-5-abA175FXXS3BZA5-4k |
| 结果 | uid=0(root) / u:r:kernel:s0 |
| Root shell | g4d 守护进程 + g4sh 客户端 |
| 持久化 | 每次启动 |
| 漏洞利用退出 | 干净退出,无内核 panic |
| 所遇到的缓解机制 | Samsung KDP, DEFEX, SELinux, PANIC_ON_OOPS, arm64 KASLR |
最初的 ghostlock 研究提供了入口原语:
pselect reclaim
↓
fake rt_mutex_waiter
↓
constrained rb-tree pointer write
然而,在 Galaxy A17 上,标准的凭据修补终局手法并不奏效。
KDP 在 EL2 层保护与凭据相关的内核数据。
在此构建版本上,即使目标地址正确,修改任务凭据的尝试也会被静默丢弃。
因此,本移植版本不是写入 root 凭据,而是让内核使用现有的特权凭据执行代码。
最终阶段:
constrained kernel write
↓
physical read/write channel
↓
KASLR slide recovery
↓
discover system_wq / cpu_pwq
↓
forge work_struct
↓
call_usermodehelper_exec_work
↓
/system/bin/sh
↓
uid=0(root), u:r:kernel:s0
一个伪造的工作项被放置到绑定的 system_wq 池上,并通过 ptmx 分配/释放风暴来触发。
由此产生的 usermode helper 以 init 凭据执行。
无需覆写任务凭据。
userspace shell (uid 2000)
│
▼
pselect / PI-futex primitive
│
▼
constrained aligned kernel pointer write
│
▼
forged pipe_buffer channel
│
▼
arbitrary physical read/write
│
├── recover KASLR slide
│
├── locate system_wq / cpu_pwq
│
└── prepare forged work_struct
│
▼
queue usermode-helper work
│
▼
ptmx storm wakes worker
│
▼
/system/bin/sh runs with init creds
│
▼
uid=0(root)
│
▼
g4d → @ghostlockd → g4sh
与公开的 OnePlus 移植版相比,初始写入原语之后的大部分阶段都被重新设计。
凭据修补终局手法被替换为针对 usermode-helper 执行路径的伪造 workqueue 项。
这完全避免了写入受保护的 cred 结构体。
此前基于 perf-event 的锚定方法在这台设备上并不可靠。
取而代之,该漏洞利用使用了来自 boot_id ctl_table 条目的三个已滑动指针:
procname
data
proc_handler
在采用该 slide 之前,这三个指针会相互交叉验证。
cpu_pwq 通过遍历以下结构来发现:
system_wq → pwqs
而不是依赖固定的设备专属偏移量。
原有的利用通道会对 struct page 的状态留下附带修改,这些修改在拆除(teardown)阶段可能触发 PANIC_ON_OOPS。
当前的利用链避免了拆除阶段的崩溃,并已被证明能够在获取 root 后干净退出。
usermode helper 会启动:
g4d
它会监听抽象 Unix 套接字:
@ghostlockd
g4sh 连接到该套接字,并提供交互式 root shell 或一次性命令执行。
/data/local/tmp/a/g4sh
/data/local/tmp/a/g4sh -c "id"
该目标结合了多种能够破坏常见 Android 内核利用技术的防护机制:
这迫使漏洞利用采用了与通常做法不同的策略:
arbitrary RW → patch cred → disable SELinux
取而代之:
arbitrary RW → recover runtime state → forge kernel work → execute usermode helper
需要较新的 Android NDK。
make
生成产物:
ghostlock # exploit
g4d # static root-shell daemon
g4sh # root-shell client
推送二进制文件:
adb push ghostlock /data/local/tmp/a/g4
adb push g4d /data/local/tmp/a/g4d
adb push g4sh /data/local/tmp/a/g4sh
adb shell 'chmod 755 /data/local/tmp/a/g4 /data/local/tmp/a/g4d /data/local/tmp/a/g4sh'
运行感知重启的漏洞利用循环:
./scripts/rr_loop4.sh
在出现 ROOTED 之后:
adb shell /data/local/tmp/a/g4sh
或者执行单条命令:
adb shell '/data/local/tmp/a/g4sh -c "id"'
预期结果:
uid=0(root) gid=0(root) groups=0(root) context=u:r:kernel:s0
该原语具有概率性,且高度依赖启动条件。
成功利用可能需要多次尝试。随附的 rr_loop4.sh 脚本会自动处理重试与重启循环。
这是一个研究性漏洞利用,而非一次即成的即时 root 工具。
qemu-e2e/ 包含一个使用所提取的三星内核进行端到端验证的测试框架。
该测试框架用于测试:
g4d / g4sh 往返通信三星内核镜像本身并不包含。
参见:
qemu-e2e/
以获取设置说明。
Makefile
src/ exploit source and device profiles
src/daemon/ g4d root daemon + g4sh client
docs/OFFSETS.md validated device offsets
docs/PORTING.md porting notes
examples/ proof-of-root artifacts
scripts/rr_loop4.sh reboot-aware exploit loop
qemu-e2e/ end-to-end QEMU validation
NebuSec:
https://nebusec.ai/research/ionstack-part-3/
https://github.com/NebuSec/CyberMeowfia/tree/main/IonStack
https://github.com/JoinChang/ghostlock-oneplus
深入探讨三星 Galaxy A17 移植版、KDP 限制、KASLR 恢复、基于 workqueue 的最终阶段以及 root shell 的实现:
https://www.mobilehackinglab.com/blog/cve-2026-43499-ghostlock-a17-root-shell
真实设备产物位于:
examples/
包括漏洞利用日志与 root 上下文验证。
示例:
uid=0(root)
gid=0(root)
groups=0(root)
context=u:r:kernel:s0
此概念验证仅供教育和授权的安全研究目的使用。
请仅在你自己拥有或已获得明确测试许可的设备与环境中使用。