针对三星 Galaxy A17 SM-A175F(运行 Android 16 / GKI 6.12)上 CVE-2026-43499(“GhostLock”) 的完整用户态到 root 提权链。
该攻击链从公开的 GhostLock 原语开始,最终以如下身份执行的用户态辅助程序结束:
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 所有。
本仓库记录了我们将该漏洞独立移植到 Samsung Galaxy A17 的过程、为适配三星内核防护所需的改动,以及一个新的最终利用阶段。
仅限授权安全研究和教育用途。
| CVE | CVE-2026-43499 — "ghostlock" |
| 设备 | Samsung 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 |
| 支持的固件 | A175FXXS3BZA5(内核 6.12.23)和 A175FXXS6CZG1(内核 6.12.38,SPL 2026-07-05)——两者均经设备验证,使用相同利用链 |
原始 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 分配/释放风暴触发。
由此产生的用户态辅助程序以 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 移植版本相比,初始写入原语之后的大多数阶段都经过了重做。
凭据修补的收尾阶段被替换为一个伪造的 workqueue 项,其目标是 usermode-helper 执行路径。
这完全避免了对受保护的 cred 结构进行写入。
先前的 perf-event 锚定方法在此设备上并不可靠。
相反,该漏洞利用使用来自 boot_id ctl_table 条目的三个带偏移的指针:
procname
data
proc_handler
这三者都会在接收该幻灯片之前进行交叉验证。
cpu_pwq 通过遍历以下内容来发现:
system_wq → pwqs
而不是依赖固定的设备特定偏移量。
原始通道会留下对 struct page 状态的附带更改,这些更改可能在拆除期间触发 PANIC_ON_OOPS。
当前链条避免了拆除崩溃,并已演示在获得 root 后干净退出。
用户态辅助程序启动:
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 # BZA5 firmware (kernel 6.12.23)
make czg1 # CZG1 firmware (kernel 6.12.38): per-target slide anchors,
# offsets are uname-keyed at runtime
生成:
ghostlock # exploit (ghostlock-czg1 for the CZG1 build)
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
深入探讨 Samsung 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
本概念验证仅供教育和经授权的安全研究目的使用。
仅可在您拥有或已获得明确测试许可的设备与环境中使用。