
Démarre un noyau Linux personnalisé sur les téléviseurs LG webOS rootés via kexec, avec prise en charge du watchdog SoC rétro-ingénieré, des payloads framebuffer et un flux de compilation de noyau initramfs.
Démarrez un noyau Linux personnalisé sur un téléviseur LG webOS rooté via kexec — en RAM, sans contournement du secure-boot.
Statut : travail en cours. Un noyau personnalisé peut être préparé et atteint l’espace utilisateur, mais il ne reste pas encore actif en tant qu’OS utilisable.
LG 50UP81009LR (webOS 6.5, Realtek RTD2875, armv7l). Rooté via Homebrew Channel ; le noyau signé d’origine + l’espace utilisateur webOS sont intacts.
kexec -l prépare un noyau (d’origine ou compilé) ; /sys/kernel/kexec_loaded passe à 1.kexec -e remplace le noyau en cours d’exécution (le téléviseur revient ensuite à l’état d’origine)./sbin/init a exécuté du vrai code.startup.sh webOS d’origine — le bootloader signé / ATF / OP-TEE ne sont jamais touchés.La réinitialisation est le watchdog du SoC (bloc TC). Le micom_wdt_thread() du noyau d’origine
le maintient à distance avec trois écritures de registres (drivers/rtk_kdriver/platform/tv006/intmicom.c) :
TCWCR @ 0xFE062204 <- 0xA5 // unlock
TCWOV @ 0xFE062210 <- 0x0FFFFFFF // max overflow => huge timeout
TCWTR @ 0xFE062208 <- 0x01 // kick
Sous kexec, l’écriture brute *(volatile*)0xFE062208 = 0x01 du pilote atterrit sur une adresse virtuelle non mappée
et est un no-op silencieux, donc le watchdog du SoC se déclenche (~10–21 s). micom-pet.c fait
désormais les mêmes écritures depuis l’espace utilisateur via /dev/mem (CONFIG_DEVMEM=y), qui mappe
correctement, plus un keepalive 0xB1 vers /dev/sys-intmicom en défense en profondeur.
Statut : micom-pet.c réécrit, compile avec la chaîne d’outils musl, et un
test de fumée bénin de 5 s sur le téléviseur en direct a confirmé qu’il s’exécute et écrit sa trace
(0x52455814 = "REX"+beat). La seule preuve restante est un démarrage kexec -e qui
reste actif au-delà de ~21 s — cela redémarre le téléviseur, c’est donc un test supervisé.
wlan d’origine doit correspondre à CONFIG_LOCALVERSION="" pour charger ; pas encore intégré à l’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)
Couper l’alimentation = état d’origine. Impossible à briquer.
La majeure partie de ce dépôt a été assemblée par Rex — une instance d’agent de codage IA — aidant un humain à opérer son propre téléviseur, dans son propre salon. L’IA a écrit le PoC kexec, la chaîne de démarrage, les canaries du framebuffer et ces analyses de rétro-ingénierie. Mais les affirmations de ce README n’ont été faites qu’après que l’humain a allumé le téléviseur, regardé l’écran et confirmé. Si une affirmation n’est pas étayée par une vérification réelle à l’écran/photo/uptime sur le matériel, elle n’est pas ici.
Aucun téléviseur n’a été briqué lors de la création de ce dépôt. Certains ont été temporairement confus (un noyau kexec sans pet du watchdog réinitialise votre boîtier après ~15 s), puis remis sous tension pour revenir à l’état d’origine. /tmp est effacé à chaque réinitialisation, donc le téléviseur oublie tout ce que nous avons fait — c’est tout l’intérêt.
rexos/ — l’OS personnalisé : hook de démarrage, compilation du noyau, initramfs, stub RexBus.kexec-poc/ — la preuve de concept chargement uniquement + charges canaries du framebuffer.docs/ — analyses de rétro-ingénierie (démarrage/sécurité, chargement d’applications SAM, carte de surface, schéma luna2).Ces étapes reproduisent ce que nous avons fait, sur le matériel exact. Rien n’est truqué.
192.168.2.103 par défaut ci-dessous ; modifiez si le vôtre diffère.KERNEL_SRC=/path/to/linux-4.4.3 (téléchargez l’archive 03.53.45 K7LP GPL depuis l’open-source LG), ou créez un lien symbolique ~/lgtv-toolkit/kernel-src/kernel/linux-4.4.3.kexec statique (pas besoin du TV, ~2 min)git clone https://github.com/ggfuchsi-oss/lg-webos-kexec
cd lg-webos-kexec/kexec-poc && ./build.sh
Attendu : un binaire kexec ARM statique à kexec-arm (168K, file indique ELF 32-bit LSB ... ARM ... statically linked).
cd ../kexec-poc
./run-poc.sh 192.168.2.103 ~/.ssh/tv_key
Résultat attendu :
staged before : 0
staged after load : 1 <- kernel accepted, DTB wired, segments allocated
staged after unload: 0 <- cleared, TV untouched
Cela prépare le propre noyau actuel du téléviseur via kexec puis le décharge immédiatement. /sys/kernel/kexec_loaded passe à 1 puis revient à 0. Pas de redémarrage, pas de changement de noyau, rien ne persiste. Débrancher la prise = état d’origine.
Ne faites cela que si le téléviseur est allumé et que quelqu’un est présent :
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)
Mises en garde honnêtes à l’étape 3 (pas des bugs que je cache) :
kexec -e, le nouveau noyau atteint l’espace utilisateur mais le téléviseur se réinitialise après ~10–21 s car le watchdog micom/SOC n’est pas nourri. C’est le mur actuel, pas un bug de crash. rexos/initramfs/micom-pet.c est le démon censé corriger cela (encore en cours d’intégration).kexec-poc/canary/). De vrais graphismes nécessitent le chemin RPC VCPU (pas fait).Ce dépôt contient les sources + la documentation + les entrées de compilation capturées sur le TV (.config du noyau, module wifi + firmware, bibliothèques rootfs), mais pas l’arborescence des sources du noyau GPL LG K7LP d’environ 390 Mo — c’est à LG de la distribuer, pas à nous de l’héberger.
make échouera avec un message clair KERNEL_SRC missing si l’arborescence du noyau n’est pas présente — il n’y a pas de demi-compilation silencieuse.
Autant que nous puissions en juger, c’est le premier démarrage public d’un noyau personnalisé basé sur kexec pour un téléviseur LG webOS. Les primitives (kexec, webOS rooté, RTD2875) sont toutes connues individuellement ; l’application à ce téléviseur grand public verrouillé semble nouvelle. Nous ne revendiquons pas un contournement du secure-boot — nous l’évitons.
GPL-2.0 (travail sur le noyau ; la source du noyau GPL de LG est GPL). Nos scripts sont compatibles GPL. Voir CREDITS pour l’attribution en amont.
| dépendance | comment l’obtenir |
|---|
LG K7LP GPL linux-4.4.3 (RTD2875) | site open-source LG → archive 03.53.45 K7LP GPL → kernel |
| musl armv7 cross-toolchain (~98 MB) | téléchargé automatiquement par kexec-poc/build.sh (autonome) |
| Un TV rooté (50UP81009LR) | nécessaire la première fois, uniquement pour capturer .config — mais cette config est maintenant commitée dans rexos/kernel/rexos-tv.config, donc un clone compile hors ligne |