
Загружает кастомное ядро Linux на рутованных телевизорах LG webOS через kexec, с поддержкой watchdog SoC, восстановленной реверс-инжинирингом, framebuffer-пейлоадами и процессом сборки ядра с initramfs.
Загрузите собственное ядро Linux на рутованный LG webOS TV через kexec — в RAM, без обхода secure-boot.
Статус: в разработке. Собственное ядро можно подготовить, и оно доходит до userspace, но пока не остаётся работать как полноценная ОС.
LG 50UP81009LR (webOS 6.5, Realtek RTD2875, armv7l). Рутован через Homebrew Channel; штатное подписанное ядро и userspace webOS не трогаются.
kexec -l подготавливает ядро (штатное или собранное из исходников); /sys/kernel/kexec_loaded переключается в 1.kexec -e заменяет работающее ядро (после этого TV сбрасывается обратно в сток)./sbin/init выполнил реальный код.startup.sh webOS — подписанный загрузчик / ATF / OP-TEE не затрагиваются.Сброс выполняет SoC watchdog (блок 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 из драйвера попадает в неотображённый
виртуальный адрес (unmapped VA) и молча игнорируется, поэтому SoC watchdog срабатывает (~10–21 с). micom-pet.c теперь делает те же обращения из userspace через /dev/mem (CONFIG_DEVMEM=y), который маппится корректно, плюс keepalive 0xB1 в /dev/sys-intmicom как эшелонированная защита.
Статус: micom-pet.c переписан, компилируется с musl-тулчейном, и 5-секундный
безвредный smoke-тест на живом TV подтвердил, что он запускается и записывает свой breadcrumb
(0x52455814 = "REX"+beat). Осталось только доказать kexec -e-загрузку, которая
держится дольше ~21 с — это перезагружает TV, поэтому тест проводится в присутствии человека.
wlan должен совпадать с 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 — экземпляр ИИ-кодинг-агента — помогая человеку работать с его собственным TV в его собственной гостиной. ИИ написал kexec-PoC, загрузочную цепочку, framebuffer-канарейки и эти RE-отчёты. Но утверждения в этом README делались только после того, как человек включил TV, посмотрел на экран и подтвердил результат. Если утверждение не подкреплено реальной проверкой экрана/фото/аптайма на железе, его здесь нет.
Ни один TV не был забрикован при создании этого репозитория. Некоторые временно пребывали в замешательстве (ядро под kexec без пинка сторожевого таймера сбрасывает ваш аппарат через ~15 с), после чего перезагружались обратно в сток. /tmp стирается при каждой перезагрузке, так что TV забывает всё, что мы делали — в этом и смысл.
rexos/ — собственная ОС: boot-хук, сборка ядра, initramfs, заглушка RexBus.kexec-poc/ — PoC только с загрузкой + canary-нагрузки для framebuffer'а.docs/ — разборы реверс-инжиниринга (загрузка/безопасность, загрузка SAM-приложений, карта поверхности, схема luna2).Эти шаги воспроизводят то, что делали мы, на том же железе. Ничего не сфабриковано.
192.168.2.103; если у вас другой, поправьте.KERNEL_SRC=/path/to/linux-4.4.3 (скачайте GPL-тарбол 03.53.45 K7LP с open-source сайта LG), либо сделайте symlink ~/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
Это подготавливает через kexec текущее штатное ядро самого TV и сразу же выгружает его. /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 новое ядро доходит до userspace, но TV сбрасывается через ~10–21 с, потому что micom/SOC watchdog не получает пинков. Это текущая стена, а не баг с крашем. rexos/initramfs/micom-pet.c — демон, который должен это исправить (всё ещё подключается).kexec-poc/canary/). Для настоящей графики нужен путь VCPU RPC (не сделано).Репозиторий содержит исходники + документацию + захваченные с TV входные данные для сборки (.config ядра, wifi-модуль и прошивку, библиотеки rootfs), но не само ~390 МБ дерево исходников GPL-ядра LG K7LP — это LG должна распространять сама, а не мы.
make упадёт с понятной ошибкой KERNEL_SRC missing, если дерева ядра нет — никакой тихой полусборки.
Насколько нам известно, это первый публичный запуск собственного ядра на LG webOS TV через kexec. Сами примитивы (kexec, рутованный webOS, RTD2875) по отдельности известны; применение к этому закрытому потребительскому TV выглядит новым. Мы не заявляем об обходе secure-boot — мы его обходим стороной.
GPL-2.0 (работа с ядром; исходники GPL-ядра LG — GPL). Наши скрипты совместимы с GPL. Атрибуция вышестоящих проектов — в CREDITS.
| зависимость | как получить |
|---|
LG K7LP GPL linux-4.4.3 (RTD2875) | сайт open-source LG → GPL-тарбол 03.53.45 K7LP → kernel |
| musl armv7 cross-тулчейн (~98 МБ) | автоматически скачивается скриптом kexec-poc/build.sh (самодостаточно) |
| рутованный TV (50UP81009LR) | нужен был один раз, только чтобы снять .config — но этот конфиг теперь закоммичен в rexos/kernel/rexos-tv.config, так что клон собирается офлайн |