
Arranca un kernel Linux personalizado en televisores LG webOS rooteados mediante kexec, con soporte de watchdog de SoC obtenido mediante ingeniería inversa, payloads de framebuffer y un flujo de compilación de kernel con initramfs.
Arranca un kernel Linux personalizado en un TV LG webOS rooteado mediante kexec — en RAM, sin bypass de arranque seguro.
Estado: trabajo en curso. Un kernel personalizado puede prepararse y llega al espacio de usuario, pero todavía no se mantiene activo como un SO utilizable.
LG 50UP81009LR (webOS 6.5, Realtek RTD2875, armv7l). Roteado mediante Homebrew Channel; el kernel firmado de serie y el espacio de usuario de webOS quedan intactos.
kexec -l prepara un kernel (de serie o desde el código fuente); /sys/kernel/kexec_loaded pasa a 1.kexec -e reemplaza el kernel en ejecución (el TV se reinicia y vuelve al estado de serie después)./sbin/init ejecutó código real.startup.sh de webOS de serie — el bootloader firmado / ATF / OP-TEE nunca se tocan.El reinicio es el watchdog del SoC (bloque TC). El micom_wdt_thread() del kernel de serie
lo mantiene a raya con tres escrituras en registros (drivers/rtk_kdriver/platform/tv006/intmicom.c):
TCWCR @ 0xFE062204 <- 0xA5 // unlock
TCWOV @ 0xFE062210 <- 0x0FFFFFFF // max overflow => huge timeout
TCWTR @ 0xFE062208 <- 0x01 // kick
Bajo kexec, el *(volatile*)0xFE062208 = 0x01 crudo del driver cae en una VA sin asignar
y es un no-op silencioso, por lo que el watchdog del SoC se dispara (~10–21 s). Ahora micom-pet.c
hace las mismas escrituras desde el espacio de usuario mediante /dev/mem (CONFIG_DEVMEM=y), que mapea
correctamente, más un keepalive 0xB1 a /dev/sys-intmicom como defensa en profundidad.
Estado: micom-pet.c reescrito, compila con el toolchain musl, y una
prueba de humo benigna de 5 s en el TV en vivo confirmó que se ejecuta y escribe su marca
(0x52455814 = "REX"+beat). La única prueba restante es un arranque con kexec -e que
se mantenga activo más allá de ~21 s — eso reinicia el TV, así que es una prueba supervisada.
wlan de serie debe coincidir con CONFIG_LOCALVERSION="" para cargar; aún no integrado en el 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)
Quitar la corriente = estado de serie. No puede brickear.
La mayor parte de este repo fue creada por Rex — una instancia de agente de codificación de IA — ayudando a un humano a operar su propio TV, en su propia sala de estar. La IA escribió el PoC de kexec, la cadena de arranque, los canarios de framebuffer y estos análisis de ingeniería inversa. Pero las afirmaciones de este README solo se hicieron después de que el humano encendiera el TV, mirara la pantalla y lo confirmara. Si una afirmación no está respaldada por una comprobación real de pantalla/foto/uptime del hardware, no está aquí.
Ningún TV fue brickeado en la creación de este repo. Algunos quedaron temporalmente confundidos (un kernel kexec sin watchdog pet reinicia tu caja después de ~15 s), y luego volvieron al estado de serie al reiniciar. /tmp se borra con cada reinicio, así que el TV olvida todo lo que hicimos — ese es el punto.
rexos/ — el SO personalizado: hook de arranque, compilación del kernel, initramfs, stub de RexBus.kexec-poc/ — la prueba de concepto solo de carga + payloads canarios de framebuffer.docs/ — análisis de ingeniería inversa (arranque/seguridad, carga de apps SAM, mapa de superficies, esquema luna2).Estos pasos reproducen lo que hicimos, en el hardware exacto. Nada está falsificado.
192.168.2.103 por defecto abajo; edítalo si el tuyo difiere.KERNEL_SRC=/path/to/linux-4.4.3 (descarga el tarball GPL K7LP 03.53.45 desde el open-source de LG), o crea un symlink ~/lgtv-toolkit/kernel-src/kernel/linux-4.4.3.kexec estático (sin necesidad de TV, ~2 min)git clone https://github.com/ggfuchsi-oss/lg-webos-kexec
cd lg-webos-kexec/kexec-poc && ./build.sh
Esperado: un binario ARM estático kexec en kexec-arm (168K, file muestra ELF 32-bit LSB ... ARM ... statically linked).
cd ../kexec-poc
./run-poc.sh 192.168.2.103 ~/.ssh/tv_key
Resultado esperado:
staged before : 0
staged after load : 1 <- kernel accepted, DTB wired, segments allocated
staged after unload: 0 <- cleared, TV untouched
Esto prepara el propio kernel actual del TV mediante kexec y luego lo descarga inmediatamente. /sys/kernel/kexec_loaded pasa a 1 y luego vuelve a 0. Sin reinicio, sin cambio de kernel, nada persiste. Desenchufar = estado de serie.
Haz esto solo con el TV encendido y alguien 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)
Advertencias honestas conocidas en el paso 3 (no son bugs que esté ocultando):
kexec -e, el nuevo kernel llega al espacio de usuario pero el TV se reinicia después de ~10–21 s porque no se está alimentando al watchdog micom/SOC. Ese es el muro actual, no un bug de caída. rexos/initramfs/micom-pet.c es el daemon destinado a arreglarlo (aún integrándolo).kexec-poc/canary/). Los gráficos reales necesitan la ruta VCPU RPC (no hecha).Este repo contiene código fuente + documentación + las entradas de compilación capturadas del TV (.config del kernel, módulo wifi + firmware, librerías del rootfs), pero no el árbol de código fuente del kernel LG K7LP GPL de ~390 MB en sí — distribuirlo es responsabilidad de LG, no nuestra.
make fallará con un claro KERNEL_SRC missing si el árbol del kernel no está presente — no hay una compilación a medias silenciosa.
Por lo que sabemos, este es el primer arranque público de un kernel personalizado basado en kexec para un TV LG webOS. Las primitivas (kexec, webOS rooteado, RTD2875) son todas conocidas individualmente; la aplicación a este TV de consumo bloqueado parece ser nueva. No afirmamos un bypass de arranque seguro — lo sorteamos.
GPL-2.0 (trabajo del kernel; el código fuente GPL del kernel de LG es GPL). Nuestros scripts son compatibles con GPL. Consulta CREDITS para la atribución a los proyectos originales.
| dependencia | cómo obtenerla |
|---|
LG K7LP GPL linux-4.4.3 (RTD2875) | sitio de open-source de LG → tarball GPL K7LP 03.53.45 → kernel |
| toolchain cruzado musl armv7 (~98 MB) | descargado automáticamente por kexec-poc/build.sh (autocontenido) |
| Un TV rooteado (50UP81009LR) | necesario la primera vez, solo para capturar .config — pero esa configuración ahora está incluida en rexos/kernel/rexos-tv.config, así que un clon compila sin conexión |