CVE-2026-43499 移植到三星 Galaxy S26 系列 — Android 16 / GKI 6.12。 单个二进制文件,三条内核线,运行时动态参数 匹配:理论上无需针对每个构建单独编译即可覆盖整个 S26 系列。
大多数 GhostLock 移植工作都针对单一设备或单一固件。 本仓库是一个全新的移植,针对 S26 目标重写了所有机制,并预期覆盖整个系列
@diabl0w 的 https://github.com/diabl0w/DFRoot 是一个更简单、更好的解决方案。我建议使用它。
本仓库中的漏洞利用已被合并到 https://github.com/snothin/GhostSam。GhostSam 更复杂;DFRoot 更纯粹、更简单。
在维护 snothin/CyberMeowfia 的同时, 我发现原始的 pipe physrw 通道不稳定(它会切断网络),因此 我放弃了那条路线并探索替代方案。后来我发现 monovibe 在我所探索的路径上走得更远,于是采用了该方法,并 经过反复调试后本仓库得以成形。
uid=0(root) context=u:r:kernel:s0 运行;通过 su_daemon 在 /data/local/tmp/temp_su.sock 上提供持久
root shell。system_unbound_wq 上伪造一个 work_struct,其函数为 call_usermodehelper_exec_work,因此内核
以 init 凭据执行我们的守护进程。KDP 对凭据页的 EL2 防护永远不会
被触发。logcat)上;DEFEX 的 safeplace 规则看到的是一个白名单路径。tracefs slide oracle → KASLR base
pselect + futex PI race
→ one aligned qword kernel write
→ attr carrier (controller + data misc nodes)
the write links both nodes
clearing controller.minor makes the next open land on data
data fd reads/writes any kernel address
→ UMH root (workqueue injection)
forged work_struct on system_unbound_wq
ptmx open/close storm wakes a worker
kernel execs daemon with init creds
→ KernelSU late-load: ksud bind-mounted over logcat in a private
mount namespace (DEFEX safeplace sees a whitelisted path)
→ su_daemon keeps serving /data/local/tmp/temp_su.sock
参数按内核线(三条线:cn、intl、exynos)匹配,而不是
按单个构建匹配。未知的 OTA 构建会按机型和 CSC 回退到最接近的已知线。
完全未知的机型会被拒绝(fail-closed)。内嵌的构建
列表以 exploit/src/params_table.c 为准。
未列出固件的自定义内核线可在运行时提供
(/data/local/tmp/ghostlock-lines.conf,参见环境)。
移植到新设备或固件时所需的参数参见 PORTING.md。
| 型号 | 设备代号 | 已测试构建 |
|---|---|---|
| SM-S942x (S26 骁龙) | m1q | S9420ZCS4AZG1, S942QOPU1AZDE, S942U1UES4AZG3, S942USQS4AZG3 |
| SM-S947x (S26+ 骁龙) | m2q | S9470ZCS4AZG1, S947USQS4AZG3 |
| SM-S9480 (S26 Ultra 国行) | m3q | S9480ZCS3AZF1, S9480ZCS4AZG1(已测试构建) |
| SM-S948x (S26 Ultra) | m3q | S9480ZHS4AZG1, S948BXXS4AZG5/6, S948NKSS4AZG3, S948U1UES2AZE1, S948USQS4AZG3 |
| SM-S942B (S26 Exynos) | m1s | S942BXXS4AZG5 |
| SM-S947B (S26+ Exynos) | m2s | S947BXXS3AZF1, S947BXXS4AZG5 |
需要 Android NDK(r26+)。只需运行:
cd exploit
make preload
# produces build/bin/preload.so (exploit) and build/embed/su_daemon_aarch64_pie (embedded daemon)
将 preload.so、su_daemon_aarch64_pie 和 ksud 推送到设备(从 adb
shell 会话运行,uid 2000):
adb push exploit/build/bin/preload.so /data/local/tmp/
adb push exploit/build/embed/su_daemon_aarch64_pie /data/local/tmp/cve-2026-43499-root
adb push <ksud> /data/local/tmp/ksud
adb shell chmod 755 /data/local/tmp/cve-2026-43499-root /data/local/tmp/ksud
# Single attempt:
adb shell "env LD_PRELOAD=/data/local/tmp/preload.so sh"
该漏洞利用是概率性的(竞态),通常需要反复尝试。在
成功运行时,su_daemon 会监听 /data/local/tmp/temp_su.sock,任何
本地进程都可以连接。
启动声明防护(/data/local/tmp/ghostlock-boot.log)记录
每次启动运行的结果;同一次启动中的第二次全链运行会被拒绝。清除该
文件或设置 BOOT_FORCE=1 可覆盖。
每个选项都以环境变量、配置文件键
(/data/local/tmp/ghostlock.conf,每行一个 key=value)和 CLI 标志
(--key=value)的形式存在;优先级为 默认值 < 文件 < 环境变量 < CLI。使用
--help 运行会打印完整表格(名称、默认值、范围、重载标志)。
行为开关:
| 环境变量 | 键 | 效果 |
|---|---|---|
BOOT_FORCE=1 | boot.force | 允许在同一次启动中重新运行 |
GHOSTLOCK_NO_KSU=1 | ksu.skip | 跳过 KernelSU 延迟加载:仅宽松的临时 root + su socket;重启可恢复设备(Knox 风险) |
ALLOW_SHELL=1 | root.allow_shell | 在延迟加载期间将 shell uid 添加到 KernelSU 允许列表 |
PARAMS_CUSTOM=1 | params.custom | 仅使用自定义内核线(若不可用则 fail closed) |
其余键用于调整竞态(walk.*、heap.* 等)。exynos 线
为配对的 ksud 注入 KSUD_TREE=exynos(驱动接口 32601);其他
线不携带 tree 覆盖。未列出固件的自定义内核线放在
/data/local/tmp/ghostlock-lines.conf(line_id=... 加上每行一个字段,
参见 PORTING.md)。
exploit/src/kernelsnitch/)