研究工具包,通过 Chromium WasmGC RCE 和 V4L2 physmap 任意物理内存访问,对三星 Tizen 9 电视进行 root,并具备持久化的开机自启载荷和 root shell 通道。
针对运行 Tizen 9 的 2024 款 Samsung Neo QLED 的非官方安全研究。 无需 sdb,无需开发者模式,无需刷写固件:电视从其自带的浏览器中被 root, 并且通过一个原厂的开机自启动服务应用使 root 持久化。
| 测试设备 | 2024 款 Neo QLED,QNX1D 系列(QTV T09 平台) |
| 固件 | T-PTMxxxx (01400) |
| 内核 | Linux 5.4.249,ARM32(VMSPLIT_3G + HIGHMEM,无 LPAE),PAGE_OFFSET 0xC0000000,PHYS_OFFSET 0x20000000 |
| 浏览器 | Chromium 120.0.6099.5 (SamsungBrowser/7.0) |
| Root | uid=0,CapEff=0x3fffffffff |
| 持久化载荷 | 仓库 v41(当前 md5/大小见 AGENTS.md 状态行——由产物重新生成);测试设备运行同一构建(部署于 2026-10-27,信标携带 tok=);payload_backup.dll 保留上一构建 |
| Root 通道 | 电视上的 TCP 31337,行协议,回复以 __END__ 结尾 |
pwsh -File .\root.ps1 -TvIp <tv-ip> # root the TV
pwsh -File .\uninstall.ps1 -TvIp <tv-ip> # restore stock
root.ps1 在 PC 上运行并驱动一切:它启动 80 端口服务器,对浏览器 stub 进行 root,安装启动载荷,并在重启后等待 root 通道。有两个步骤仍需在电视遥控器上完成,脚本会提示这两步:
http://<pc-ip>/index.html 并等待出现 RUNNING;然后:
python tools\root_shell.py "id" <tv-ip> # talk to the TV's root channel
每个选项、确切的提示、预期输出、主机 IP 注意事项以及手动回退方案:docs/USAGE.md。
/dev/video40/30/60)在 mmap() 中接受攻击者选择的 vm_pgoff,并将其未经校验地传给 remap_pfn_range():从而允许非特权进程(uid 5001,组 video)任意读写物理内存。init_task,通过 fork 出的子进程的 real_parent 定位我们自己的 task,然后将凭据清零。app_onboot 服务的 IL 程序集替换为 .NET 载荷,该载荷在每次启动时重复 physmap/凭据补丁,关闭其节点,并在 TCP 31337 上提供 root 命令通道。没有 GPU CVE,没有内核漏洞利用,没有签名模块。physmap 才是有趣的部分;带有实测常量的逐阶段说明见 docs/EXPLOIT.md。
| 文档 | 内容 |
|---|---|
docs/USAGE.md | 运行方式:选项、提示、预期输出、卸载细节、恢复 |
docs/EXPLOIT.md | 逐阶段讲解攻击链,包含固件特定的常量 |
docs/ROOT-METHODS.md | 评估过的每种 root/持久化方法,以及最终胜出的那一种 |
docs/FAILED.md | 哪些方法没有奏效以及原因——读起来像一份死胡同清单,能节省数周时间 |
docs/BOOT-REGRESSION-SMACK.md | 项目中最隐蔽的 bug:错误的 SMACK 标签导致应用在 Main 之前就退出 |
docs/PORTABILITY.md | 另一台 Tizen 9 电视:四道关卡、需要重新测量的内容、分步移植 |
docs/SERVER-HOSTING.md | PC 端服务器:必须如何运行、静默死亡陷阱、防火墙、日志 |
docs/SCRIPT-REVIEW.md | 脚本的生产就绪性审计 |
docs/TESTING.md | 测试层级,离线与电视上,以及各自能捕获什么 |
docs/LOGGUIDE.md | 每个信标和工具错误的解读,以及后续步骤 |
docs/REFERENCE-MATERIALS.md | 从哪里为你的型号下载固件 / GPL 源码 / 模拟工具 |
docs/REVIEW-HISTORY.md | 已关闭的审查发现及其证据(存档) |
docs/OPEN-ISSUES.md | 当前状态、待办工作,以及已关闭的审查/通过历史 |
AGENTS.md | 交接:工具、流程、验证、陷阱、恢复 |
CHANGELOG.md | 按日期记录变更内容及原因 |
SECURITY.md | 未认证的 31337 后门、范围、报告、法律 |
NOTICE.md | 第三方归属;哪些文件未重新授权 |
LICENSE | 原创作品采用 MIT 许可(第三方文件除外) |
root.ps1, uninstall.ps1 PC entry points (PowerShell)
payload/ boot payload source (.NET 6, Program.cs)
server/ port-80 server, exploit page, TV-side deploy scripts
tools/ physmap client, kernel helpers, build scripts
docs/ the documents above
AGENTS.md hand-off notes
LICENSE, NOTICE.md license + third-party attribution
SECURITY.md backdoor/scope/reporting
整个工具包已提交,因此克隆后无需任何其他工作树即可运行。
server/payload.dll 是有意包含的(与构建输出字节完全一致),
这样工具包无需 .NET SDK 即可工作。运行时日志、构建输出以及
按主机生成的部署脚本均被 git 忽略,且从不通过 HTTP 提供。
docs/PORTABILITY.md。server/deploy.sh 是一个模板,其 H=/WANT=/SIZE_WANT=/TOKEN= 标记由 server.py 按请求渲染,
渲染依据是 TV 使用的地址和实际提供的 payload,页面会重写
shellcode 的回调(IP 和 端口),而 payload 会读取
share/rootchan.host。编译内置的 Host 是一个 TEST-NET 占位符。docs/SERVER-HOSTING.md)。payload/global.json 固定
10.0.x(rollForward: latestPatch);该项目目标为 net6.0,固定版本的 SDK 仍可构建
(预期会出现 EOL 警告)。参考资料(固件、GPL 内核源码、QEMU 工具)未 捆绑提供;docs/REFERENCE-MATERIALS.md 列出了 针对你自己的型号下载各部分内容的位置。
该方法是可移植的;此构建则不是。payload.dll 硬编码了此内核的
PHYS_OFFSET、init_task 以及四个 task_struct 偏移量,且浏览器利用链
特定于 Chromium 120。简版说明:
server/probe.html(安全;不执行任何内容)并在
TV 上打开它。你需要带 WasmGC 的 Chromium ~120;否则此 CVE 不
适用。owner 身份获取代码执行(浏览器利用链),然后
用 tools/physmap.py / tools/physrpc.S 在 TV 的某个 /dev/video* 节点上
证明任意 pfn 的 mmap。如果偏移量得到验证,则停止。PHYS_OFFSET、Image 基址、init_task 以及
tasks/comm/cred/real_parent 偏移量。编辑
payload/Program.cs 中的常量;重新检查下方的读取可靠性限制。/opt 上找到一个 dotnet-inhouse、app_onboot 应用,
其文件可以在其自身的 SMACK 标签下重写。在
server/deploy.sh、server/uninstall.sh 和 server/recover.sh 中设置其应用 id/路径。dotnet build -c Release -o out,将产物
复制覆盖 server/payload.dll(部署门槛由它渲染,因此无需
编辑 WANT=),通过 root.ps1 部署,然后冷启动。第 2 次尝试是
预期下限。在测试设备上发现的读取可靠性限制: 即使 VA/PA 别名正确,
video40 physmap 在读取 0xE0000000 及以上地址时也会返回
垃圾数据。线性映射本身更大(zoneinfo:high_memory = VA 0xF0400000),
因此 0xE0000000 位于其内部——首要嫌疑是 V4L2 节点的 DMA
窗口,而非 CPU 映射。无论哪种情况:在信任 Kptr 之前,请在新型号上
测试一个已知的低页和一个已知的高页;此处所有成功的 cred 补丁
都位于 0xE0000000 以下,这会影响你如何解读“未找到”。
完整的门槛、测量方法以及逐文件的移植检查清单:
docs/PORTABILITY.md。