TCL 50C721(RTD1319 / Mali-G31)root 工具包 — 自主 CVE-2022-22706 漏洞利用链
针对某一 TCL Android TV 固件的完整 root 漏洞利用链与 root 后工具包,用于实现 受限 root(tethered root)、SELinux Permissive、广告拦截、精简预装应用(debloat)与自动备份。这是针对特定固件的研究与工具,并非通用的 TCL root 工具,也不是受支持的安装程序。
| 项目 | 记录的测试单元 |
|---|---|
| 电视 | TCL QLED 50C721 / BeyondTV6 |
| 固件 | V8-R51MT02-LF1V903,build AR10 |
| Android / 内核 | Android 11 / 4.14.198+ |
| SoC / GPU | Realtek RTD1319 / Mali-G31(Bifrost,kbase r28p0) |
| 用户空间 | 32 位 ARMv7 |
| 报告的安全补丁 | 2024-03-05 |
| 历史结果 | 获得 uid=0 的 ADB shell;SELinux Permissive |
仅此型号/固件组合有成功结果的记录。原始记录中 SoC 的精确识别与 Mali 驱动版本并不一致;参见兼容性限制。在准备本次源码发布时,未进行新的 root 测试。
自主 root 二进制程序(auto_root.c)可在 2 秒内从非特权应用上下文获得 uid=0:
阶段 1 — CVE-2022-22706(Mali GPU 页缓存写入):通过 KBASE_IOCTL_MEM_IMPORT 将 libc.so 中 __cxa_atexit 所在页面的 MAP_SHARED 映射导入为 GPU 用户缓冲区。使用 mremap(MREMAP_FIXED) 替换该文件映射。在页缓存中向 __cxa_atexit 写入 112 字节的 Thumb-2 shellcode(磁盘上的文件未被修改——受 dm-verity 保护)。
阶段 3 — 自然触发:每个新的 C++ 进程在 CRT 初始化期间都会调用 __cxa_atexit(),从而执行该 shellcode。一个特权域(audioserver、rtkm_scene)通过 /dev/rtkmem 映射物理页 0x1DE7000,并写入 selinux_state.enforcing = 0。
阶段 4a — 直接修改凭据:在 SELinux Permissive 状态下,通过 /dev/rtkmem 读取物理内存,遍历内核 task_struct 链表。通过匹配 comm[] 找到我们的进程,用来自 init_cred 的 uid=0 和完整 capabilities 覆盖 cred 结构体。清除 TIF_SECCOMP 以绕过 zygote 的 BPF seccomp 过滤器。
阶段 4b — 系统加固:以 bind mount 方式挂载广告拦截 hosts,删除阻止遥测 IP 的 iptables 规则,禁用 28 个预装应用(bloatware),授予 APP_AUTO_START 以实现开机持久化,停用 shellcode,并将 SELinux 重新设为 Enforcing。
两个独立程序(root_cve22706.c、libc_rtkmem_patch2.c)将相同的 CVE-2022-22706 页缓存写入原语实现为独立的受限 root 阶段,适用于手动 ADB root 以及从原语层面理解该漏洞利用。
scripts/root.sh — ADB 自动化:连接电视,运行两个独立阶段,验证 root 与 SELinux 状态。scripts/post_root.sh — 由 auto_root 在加固后调用的 root 后钩子。创建完整的设备备份:侧载的 APK、应用数据、WiFi 配置、所有设置、软件包列表。自动清理,仅保留最近 5 份备份。不包含 APK 或可复现的 APK 应用项目;此处没有一次安装即可自动开机的发布版本。自主 root 二进制程序设计为由 APK 的原生代码调用,但 APK 封装层不属于本次发布内容。
# Build (requires Android NDK)
cd exploit && make
# Push to TV
adb connect <TV_IP>:5555
adb push bin/auto_root /data/local/tmp/
adb push bin/root_cve22706 /data/local/tmp/
adb push bin/libc_rtkmem_patch2 /data/local/tmp/
# Option A: Run the autonomous chain (includes hardening + backup)
adb shell /data/local/tmp/auto_root
# Option B: Manual two-stage root via script
bash scripts/root.sh <TV_IP>
仅可在您拥有或获得明确授权进行评估的硬件上使用。请先审查所有 C 文件以及每一项针对特定固件的假设。请保留数据,并独立获取已知匹配的恢复镜像和恢复流程。请勿将 ADB 暴露在不受信任的网络上。重启会移除易失性补丁(page-cache、bind mounts、iptables),但软件包禁用和 APP_AUTO_START 会保留。
请勿基于本项目刷入打过补丁的 boot 或 vbmeta 镜像。 历史上曾有两次尝试导致设备变砖(bootloop);既未确立持久化 root 方法,也未建立通用恢复保证。
所有原创代码均采用 MIT 许可证。内核摘录(kernel/mem.c)保留其 GPL-2.0 许可证和版权声明。有关署名和上游引用,请参阅 LICENSE 和 provenance。