通过 kexec 在已 root 的 LG webOS 电视上启动自定义 Linux 内核 —— 在 RAM 中运行,无需绕过安全启动。
状态:进行中。 自定义内核可以被暂存并进入用户空间,但尚不能作为可用的操作系统持续运行。
LG 50UP81009LR(webOS 6.5,Realtek RTD2875,armv7l)。通过 Homebrew Channel 获取 root;原厂签名内核 + webOS 用户空间均未改动。
kexec -l 可以暂存(原厂或源码编译的)内核;/sys/kernel/kexec_loaded 翻转为 1。kexec -e 会替换正在运行的内核(之后电视会重置回原厂状态)。/sbin/init 执行了真实代码。startup.sh 启动 —— 签名的引导加载程序 / ATF / OP-TEE 从未被触碰。复位源于 SoC 看门狗(TC 模块)。原厂内核的 micom_wdt_thread()
通过三次寄存器写入来维持它(drivers/rtk_kdriver/platform/tv006/intmicom.c):
TCWCR @ 0xFE062204 <- 0xA5 // unlock
TCWOV @ 0xFE062210 <- 0x0FFFFFFF // max overflow => huge timeout
TCWTR @ 0xFE062208 <- 0x01 // kick
在 kexec 下,驱动中的原始 *(volatile*)0xFE062208 = 0x01 落在一个未映射的虚拟地址上,成为一个静默的空操作,因此 SoC 看门狗会触发(约 10–21 秒)。micom-pet.c 现在通过 /dev/mem(CONFIG_DEVMEM=y)从用户空间执行相同的写入操作,这会正确映射地址,另外还向 /dev/sys-intmicom 发送 0xB1 保活消息作为纵深防御。
状态: micom-pet.c 已重写,可使用 musl 工具链编译,并且在真机上进行的 5 秒
良性冒烟测试确认它可以运行并写入其面包屑
(0x52455814 = "REX"+心跳)。唯一剩下的验证是一次能撑过约 21 秒的 kexec -e 启动 ——
这会导致电视重启,因此是一次需要有人值守的测试。
wlan 模块的 vermagic 必须与 CONFIG_LOCALVERSION="" 匹配才能加载;尚未接入 initramfs。boot ROM → ATF → signed LG kernel (~2 s) → startup.sh
→ kexec -l <our zImage + dtb + initramfs>
→ kexec -e
→ OUR kernel runs in RAM (no eMMC writes)
断电 = 恢复原厂。它不会变砖。
这个仓库的大部分内容是由 Rex —— 一个 AI 编码代理实例 —— 协助人类在自己的客厅里操作自己的电视时完成的。AI 编写了 kexec 概念验证、启动链、帧缓冲 canary 以及这些逆向工程文章。但本 README 中的每项声明都是在人类启动电视、查看屏幕并确认之后才写下的。如果某项声明没有来自硬件的真实屏幕/照片/运行时长检查作为依据,它就不会出现在这里。
本仓库的制作过程中没有电视变砖。有些电视只是暂时出现异常(没有看门狗喂狗的 kexec 内核会在约 15 秒后重置设备),然后断电重启回到原厂状态。/tmp 在每次重置时都会被清空,所以电视会忘记我们做过的所有事 —— 这正是关键所在。
rexos/ — 自定义操作系统:启动钩子、内核构建、initramfs、RexBus 桩。kexec-poc/ — 仅加载的概念验证 + 帧缓冲 canary 载荷。docs/ — 逆向工程文档(启动/安全、SAM 应用加载、surface 映射、luna2 模式)。以下步骤在完全相同的硬件上复现了我们所做的操作。没有任何造假。
192.168.2.103;如果你的不同,请修改。KERNEL_SRC=/path/to/linux-4.4.3(从 LG 开源网站下载 03.53.45 K7LP GPL 压缩包),或创建符号链接 ~/lgtv-toolkit/kernel-src/kernel/linux-4.4.3。kexec(无需电视,约 2 分钟)git clone https://github.com/ggfuchsi-oss/lg-webos-kexec
cd lg-webos-kexec/kexec-poc && ./build.sh
预期结果:获得静态 ARM kexec 二进制文件 kexec-arm(168K,file 显示 ELF 32-bit LSB ... ARM ... statically linked)。
cd ../kexec-poc
./run-poc.sh 192.168.2.103 ~/.ssh/tv_key
预期结果:
staged before : 0
staged after load : 1 <- kernel accepted, DTB wired, segments allocated
staged after unload: 0 <- cleared, TV untouched
这会通过 kexec 暂存电视当前的自身内核,然后立即卸载它。/sys/kernel/kexec_loaded 先翻转为 1 再回到 0。不会重启、不会切换内核、不留任何持久化痕迹。拔掉电源 = 恢复原厂。
仅在电视开着且有人在旁边时才执行此操作:
cd ../rexos
make # builds rexos-kernel.zImage + rexos-initramfs.cpio.gz into out/
./boot/rexos-kexec --load-only # stage, do NOT fire (same safe state as step 2)
# then, when ready to actually jump:
./boot/rexos-kexec # kexec -e -> our kernel runs in RAM (TV will reset)
第 3 步的如实注意事项(不是我隐瞒的 bug):
kexec -e 之后,新内核能够进入用户空间,但电视会在约 10–21 秒后重置,因为 micom/SOC 看门狗没有被喂狗。这是当前的瓶颈,而不是崩溃 bug。rexos/initramfs/micom-pet.c 就是用来解决这个问题的守护进程(仍在接入中)。kexec-poc/canary/)。真正的图形输出需要 VCPU RPC 路径(尚未完成)。本仓库包含源码 + 文档 + 从电视上抓取的构建输入(内核 .config、wifi 模块 + 固件、rootfs 库),但不包含约 390 MB 的 LG K7LP GPL 内核源码树本身 —— 那是 LG 的发布资源,不是让我们重新托管的。
如果内核源码树不存在,make 会以清晰的 KERNEL_SRC missing 错误失败 —— 不会有静默的半成品构建。
据我们所知,这是首次公开的基于 kexec 的 LG webOS 电视自定义内核启动。各个基础组件(kexec、已 root 的 webOS、RTD2875)此前都各自为人所知;但在这样一款被锁定的消费级电视上的应用似乎是全新的。我们并非宣称实现了安全启动绕过 —— 我们只是绕开了它。
GPL-2.0(内核相关工作;LG 的 GPL 内核源码本身就是 GPL)。我们的脚本与 GPL 兼容。上游致谢请参阅 CREDITS。
| 依赖项 | 获取方式 |
|---|
LG K7LP GPL linux-4.4.3(RTD2875) | LG 开源网站 → 03.53.45 K7LP GPL 压缩包 → kernel |
| musl armv7 交叉工具链(约 98 MB) | 由 kexec-poc/build.sh 自动获取(自包含) |
| 已 root 的电视(50UP81009LR) | 仅在首次需要,用于抓取 .config —— 但该配置现已提交至 rexos/kernel/rexos-tv.config,因此克隆后即可离线构建 |