
kexecを介してルート化されたLG webOS TVでカスタムLinuxカーネルを起動し、リバースエンジニアリングされたSoCウォッチドッグサポート、フレームバッファペイロード、initramfsカーネルビルドフローを備えています。
root化済みの LG webOS TV で kexec によりカスタムLinuxカーネルを起動 — RAM 上で実行し、セキュアブートの回避は不要。
ステータス: 開発中。 カスタムカーネルはステージングでき、ユーザー空間にも到達しますが、実用的な OS として動作し続ける状態にはまだ至っていません。
LG 50UP81009LR (webOS 6.5、Realtek RTD2875、armv7l)。Homebrew Channel で root化。ストックの署名済みカーネル + webOS ユーザー空間には一切触れません。
kexec -l が (ストックまたはソースビルドの) カーネルをステージングし、/sys/kernel/kexec_loaded が 1 に切り替わります。kexec -e が実行中のカーネルを置き換えます (その後 TV はストックにリセットされます)。/sbin/init が実際のコードを実行したことで検証済み。startup.sh から実行されます — 署名済みブートローダ / ATF / OP-TEE には一切触れません。リセットの原因は SoC ウォッチドッグ (TC ブロック) です。ストックカーネルの micom_wdt_thread()
は3つのレジスタ書き込みでそれを食い止めています (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 はマップされていない
仮想アドレスに到達し、黙って no-op になるため、SoC ウォッチドッグが発火します (約10〜21秒)。micom-pet.c は現在、
同じ書き込みをユーザー空間から /dev/mem (CONFIG_DEVMEM=y) 経由で行います。これは
正しくマップされ、さらに多層防御として /dev/sys-intmicom への 0xB1 キープアライブも送信します。
ステータス: micom-pet.c を書き直し、musl ツールチェーンでコンパイルできます。実機 TV での 5 秒間の
無害なスモークテストにより、実行されてブレッドクラム (0x52455814 = "REX"+ビート) が書き込まれることを確認済みです。
残る唯一の証明は、約 21 秒を超えて起動し続ける kexec -e ブートです — これは TV を
再起動するため、立ち会いでのテストになります。
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 コーディングエージェントのインスタンス — が、人間が自分の TV を自分のリビングルームで操作するのを支援してまとめたものです。AI は kexec の PoC、ブートチェーン、フレームバッファのカナリア、そしてこれらの RE レポートを書きました。ただし、この README の主張は、人間が TV の電源を入れ、画面を見て、確認した後でのみ記載されています。実機での画面・写真・稼働時間の確認に裏付けられていない主張は、ここにはありません。
このリポジトリの作成で文鎮化した TV はありません。一時的に混乱したものはあります (ウォッチドッグのペットがない kexec カーネルは約 15 秒後にボックスをリセットします) が、その後電源再投入でストックに戻りました。
/tmpはリセットのたびに消去されるため、TV は私たちが行ったすべてを忘れます — それがそもそものポイントです。
rexos/ — カスタムOS: ブートフック、カーネルビルド、initramfs、RexBus スタブ。kexec-poc/ — ロードのみの概念実証 (PoC) + フレームバッファのカナリアペイロード。docs/ — リバースエンジニアリングのレポート (ブート/セキュリティ、SAM アプリのロード、サーフェスマップ、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 をビルド (TV 不要、約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
これは TV の現在のカーネルそのものを kexec でステージングし、その後すぐにアンロードします。/sys/kernel/kexec_loaded が 1 に切り替わり、その後 0 に戻ります。再起動もカーネル切り替えもなく、永続するものはありません。プラグを抜けばストックです。
TV の電源が入っていて、誰かが立ち会っている場合のみ実行してください:
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 に関する正直な注意点 (隠しているバグではありません):
kexec -e の後、新しいカーネルはユーザー空間に到達しますが、micom/SOC ウォッチドッグがペットされていないため、約 10〜21 秒で TV はリセットします。これは現在の壁であり、クラッシュバグではありません。rexos/initramfs/micom-pet.c はこれを修正するためのデーモンです (まだ組み込み中)。kexec-poc/canary/ を参照)。実際のグラフィックスには VCPU RPC パスが必要です (未実装)。このリポジトリにはソース + ドキュメント + TV から取得したビルド入力 (カーネル .config、WiFi モジュール + ファームウェア、rootfs ライブラリ) が含まれますが、約 390 MB の LG K7LP GPL カーネルソースツリー自体は含まれません — それを配布するのは LG の役割であり、私たちが再ホストするものではありません。
カーネルツリーが存在しない場合、make は明確な KERNEL_SRC missing エラーで失敗します — 黙って途中までビルドされることはありません。
私たちの知る限り、これは LG webOS TV 向けの公開された最初の kexec ベースのカスタムカーネルブートです。プリミティブ (kexec、root化 webOS、RTD2875) は個々にはすべて既知ですが、このロックダウンされたコンシューマー TV への適用は新しいものと思われます。私たちはセキュアブートの回避を主張しているのではありません — 私たちはそれを迂回しています。
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化済み TV (50UP81009LR) | 最初の一度だけ .config の取得に必要 — ただしこの config は現在 rexos/kernel/rexos-tv.config にコミット済みなので、クローンだけでオフラインビルド可能 |