
Avvia un kernel Linux personalizzato su TV LG webOS con root tramite kexec, con supporto per il watchdog SoC ricavato tramite reverse engineering, payload per il framebuffer e un flusso di build del kernel con initramfs.
Avvia un kernel Linux personalizzato su un TV LG webOS con root via kexec — in RAM, senza bypassare il secure boot.
Stato: lavoro in corso. Un kernel personalizzato può essere caricato e raggiunge lo spazio utente, ma non rimane ancora attivo come sistema operativo utilizzabile.
LG 50UP81009LR (webOS 6.5, Realtek RTD2875, armv7l). Con root tramite Homebrew Channel; kernel firmato di serie e userspace webOS rimangono intatti.
kexec -l carica un kernel (di serie o compilato da sorgenti); /sys/kernel/kexec_loaded passa a 1.kexec -e sostituisce il kernel in esecuzione (dopodiché la TV si riavvia tornando allo stato di serie)./sbin/init ha eseguito codice reale.startup.sh di webOS di serie — bootloader firmato / ATF / OP-TEE non vengono mai toccati.Il reset è dovuto al watchdog del SoC (blocco TC). Il micom_wdt_thread() del kernel di serie
lo tiene a bada con tre scritture ai registri (drivers/rtk_kdriver/platform/tv006/intmicom.c):
TCWCR @ 0xFE062204 <- 0xA5 // unlock
TCWOV @ 0xFE062210 <- 0x0FFFFFFF // max overflow => huge timeout
TCWTR @ 0xFE062208 <- 0x01 // kick
Sotto kexec, la scrittura raw del driver *(volatile*)0xFE062208 = 0x01 finisce su un VA
non mappato ed è un no-op silenzioso, quindi il watchdog del SoC scatta (~10–21 s). micom-pet.c ora
esegue le stesse scritture dallo spazio utente tramite /dev/mem (CONFIG_DEVMEM=y), che mappa
correttamente, più un keepalive 0xB1 a /dev/sys-intmicom come difesa in profondità.
Stato: micom-pet.c riscritto, compila con la toolchain musl, e un test di fumo innocuo di 5 s
sulla TV reale ha confermato che viene eseguito e scrive il suo breadcrumb
(0x52455814 = "REX"+beat). L'unica prova rimanente è un avvio kexec -e che
rimane attivo oltre ~21 s — questo riavvia la TV, quindi è un test con operatore presente.
wlan di serie deve corrispondere a CONFIG_LOCALVERSION="" per caricarsi; non ancora collegato all'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)
Stacca la corrente = torna di serie. Non può brickare.
La maggior parte di questo repo è stata messa insieme da Rex — un'istanza di agente di codifica AI — che aiuta un umano a operare sulla propria TV, nel proprio salotto. L'AI ha scritto il PoC kexec, la catena di boot, i canary del framebuffer e questi resoconti di reverse engineering. Ma le affermazioni in questo README sono state fatte solo dopo che l'umano ha acceso la TV, guardato lo schermo e confermato. Se un'affermazione non è supportata da un controllo reale su schermo/foto/uptime dell'hardware, non è qui.
Nessuna TV è stata brickata durante la creazione di questo repo. Alcune sono state temporaneamente confuse (un kernel kexec senza pet del watchdog riavvia il dispositivo dopo ~15 s), poi sono tornate allo stato di serie con un ciclo di alimentazione.
/tmpviene cancellato a ogni reset, quindi la TV dimentica tutto ciò che abbiamo fatto — è proprio questo il punto.
rexos/ — il sistema operativo personalizzato: hook di boot, build del kernel, initramfs, stub RexBus.kexec-poc/ — la prova di concetto solo-caricamento + payload canary per il framebuffer.docs/ — resoconti di reverse engineering (boot/security, caricamento app SAM, mappa delle surface, schema luna2).Questi passaggi riproducono ciò che abbiamo fatto, sull'hardware esatto. Niente è finto.
192.168.2.103 di default; modifica se la tua è diversa.KERNEL_SRC=/path/to/linux-4.4.3 (scarica il tarball GPL K7LP 03.53.45 dall'open-source LG), oppure crea un symlink ~/lgtv-toolkit/kernel-src/kernel/linux-4.4.3.kexec statico (TV non necessaria, ~2 min)git clone https://github.com/ggfuchsi-oss/lg-webos-kexec
cd lg-webos-kexec/kexec-poc && ./build.sh
Previsto: un binario ARM statico kexec in kexec-arm (168K, file mostra ELF 32-bit LSB ... ARM ... statically linked).
cd ../kexec-poc
./run-poc.sh 192.168.2.103 ~/.ssh/tv_key
Risultato atteso:
staged before : 0
staged after load : 1 <- kernel accepted, DTB wired, segments allocated
staged after unload: 0 <- cleared, TV untouched
Questo carica il kernel attuale della TV tramite kexec e poi lo scarica immediatamente. /sys/kernel/kexec_loaded passa a 1 e poi torna a 0. Nessun riavvio, nessun cambio di kernel, nulla persiste. Stacca la spina = stato di serie.
Fallo solo con la TV accesa e qualcuno presente:
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)
Avvertenze oneste note al punto 3 (non sono bug che nascondo):
kexec -e, il nuovo kernel raggiunge lo spazio utente ma la TV si riavvia dopo ~10–21 s perché il watchdog micom/SOC non viene kickato. Questo è il muro attuale, non un bug di crash. rexos/initramfs/micom-pet.c è il demone che dovrebbe risolvere il problema (lo sto ancora collegando).kexec-poc/canary/). La grafica reale richiede il percorso RPC VCPU (non fatto).Questo repo contiene sorgenti + documentazione + gli input di build catturati dalla TV (.config del kernel, modulo wifi + firmware, librerie rootfs), ma non l'albero dei sorgenti del kernel GPL K7LP LG di ~390 MB — spetta a LG distribuirlo, non a noi ri-ospitarlo.
make fallirà con un chiaro KERNEL_SRC missing se l'albero del kernel non è presente — non esiste una mezza build silenziosa.
Per quanto ne sappiamo, questo è il primo avvio pubblico di un kernel personalizzato basato su kexec per un TV LG webOS. Le primitive (kexec, webOS con root, RTD2875) sono tutte note singolarmente; l'applicazione a questo TV consumer bloccato sembra essere nuova. Non stiamo sostenendo di aver bypassato il secure boot — lo aggiriamo.
GPL-2.0 (lavoro sul kernel; il sorgente GPL del kernel LG è GPL). I nostri script sono compatibili con la GPL. Vedi CREDITS per l'attribuzione upstream.
| dipendenza | come ottenerla |
|---|
LG K7LP GPL linux-4.4.3 (RTD2875) | sito opensource LG → tarball GPL K7LP 03.53.45 → kernel |
| toolchain cross armv7 musl (~98 MB) | scaricata automaticamente da kexec-poc/build.sh (autocontenuta) |
| Una TV con root (50UP81009LR) | servita la prima volta solo per catturare .config — ma quella config ora è committata in rexos/kernel/rexos-tv.config, quindi un clone compila offline |