12 KiB
06 — Toolchain & Deploy (kein Package Manager)
Status: System-/Toolchain-Constraints CONFIRMED; Dropbear-Build + Deploy live bestätigt; die Skripte in ../root/ sind der finale Weg.
1. Kein Package Manager
Live-Check (root):
for c in apt apt-get dpkg rpm opkg ipkg apk yum pacman; do command -v $c; done # leer
ls -la /etc/opkg /etc/opkg.conf /var/lib/opkg /var/lib/dpkg /usr/lib/opkg # fehlt
/bin/busybox --list | grep -E '^(opkg|dpkg|rpm|apk|ipkg)$' # leer
cat /etc/os-release # fehlt
Es gibt keinen Package Manager. Kein opkg install, kein apt, kein Paket-Repo.
Deploy = Dateien kopieren + ausführbar machen + starten. Keine „Installation“ im Distro-Sinn.
2. Bauen für den TV
| Constraint | Wert |
|---|---|
| Architektur | ARMv7, EABI5, hard-float, VFPv4/NEON |
| Kernel | 3.18.25; kein overlayfs, kein devtmpfs, devpts ja |
| TV-libc | glibc 2.18 (/lib/libc-2.18.so, ld-linux.so.3) |
| Host-Cross | arm-linux-gnueabihf-gcc, -as, -ld, -objcopy |
| Static | empfohlen; -static; der mitgelieferte Dropbear ist statisch und läuft |
| Dynamic | nur mit TV-glibc 2.18/Sysroot; sonst GLIBC_2.xx not found |
| Package Manager | keiner |
2.1 Einfaches statisches Tool
cat > hello.c <<'EOF'
#include <stdio.h>
int main(){ printf("hello tv\n"); return 0; }
EOF
arm-linux-gnueabihf-gcc -static -Os -o hello hello.c
file hello
# ELF 32-bit LSB executable, ARM, EABI5, statically linked
Deploy:
# per SSH (funktioniert immer, auch ohne SFTP)
base64 -w0 hello | ssh root@192.168.188.94 'base64 -d > /3rd_rw/bin/hello && chmod 755 /3rd_rw/bin/hello'
# oder per File.download (HTTP -> /3rd_rw/appdata) + root_loop cp/chmod
# oder nach optionalem SFTP-Install direkt: scp hello root@TV:/3rd_rw/bin/
Hinweis: Dropbear allein hat keinen sftp-server. Der finale Ordner enthält einen statischen OpenSSH-9.9p1-sftp-server + gepatchten Dropbear; nach ../root/scripts/host/install_sftp.sh funktionieren sftp und modernes scp (SFTP). Vorher: ssh + base64/cat/tar oder File.download. tar ist auf dem TV (BusyBox) vorhanden.
2.2 Dynamisches Tool (nur wenn nötig)
- Gegen die TV-glibc 2.18 linken (Sysroot/Headers aus dem TV oder ein passendes älteres Sysroot); sonst scheitert der Loader.
- Der mitgelieferte Dropbear ist statisch (glibc 2.39) und läuft auf dem 3.18-Kernel; das ist der pragmatische Weg.
LD_LIBRARY_PATH/RPATHbeachten; die TV-Libs liegen in/lib,/basic/lib,/3rd/lib,/3rd/opera4xLib,/3rd_rw/....
3. Dropbear (SSH) — Build + Deploy
Die finalen Binaries liegen in ../root/tools/pub/:
dropbear 882204 B SHA256 976ec57e401765d5fc9c0a201d19c997c004dcf91a8d4bdb039bbb8419071eae
dropbear-sftp 882204 B SHA256 a21b0d3e53dd1d124105350319df45a2b44e7cef70dd29b418644b11fdcfed57
dropbearkey 755452 B SHA256 3fbfa60891b3a9f3e971a24071ed4d14c93ee3e773dd6f4969646cc811b0dbbf
sftp-server 635680 B SHA256 d0f7700e84e582aef3948c29e4317fb0119e13393374a7455922ffa8d01202f3
3.1 Repro-Build
cd /workspace/hisense-he40e5600-root-modding
root/scripts/host/build_dropbear.sh
Das Skript nutzt sources/dropbear-2022.83.tar.bz2 (SHA unten), configured mit:
--host=arm-linux-gnueabihf
--disable-zlib --disable-pam --disable-shadow
--disable-lastlog --disable-utmp --disable-wtmp
--disable-utmpx --disable-wtmpx
--disable-pututline --disable-pututxline
CC=arm-linux-gnueabihf-gcc CFLAGS="-Os -static" LDFLAGS="-static"
und localoptions.h:
#define DROPBEAR_SVR_PASSWORD_AUTH 0
#define DROPBEAR_SVR_PUBKEY_AUTH 1
#define DROPBEAR_CLIENT 0
- Key-only: Passwort-Auth ist compile-time aus; kein
-s-Flag nötig (dieser Build kennt-snicht). --disable-shadow: kein/etc/shadow-Zugriff; Pubkey-Auth.- Static: keine TV-Lib-Abhängigkeit.
dropbearkey: Host-Key erzeugen (-t ed25519 -f /3rd_rw/sshd/host_key).dropbear-sftp:build_dropbear.shruft am Endepatch_dropbear_sftp.py; das patchtSFTPSERVER_PATHauf/3rd_rw/sshd/sftp-server(gleiche String-Länge, keine ELF-Offsets). Der statischesftp-serverkommt ausbuild_sftp_server.sh.
3.2 Deploy auf dem TV
../root/scripts/host/upload_to_appdata.js(TV-Konsole): lädtdropbear,dropbear-sftp,dropbearkey,sftp-server,authorized_keys,start_sshd.sh,root_loop.sh,hamservice-wrapper.sh,deploy_sshd.sh,verify.sh,rollback.shnach/3rd_rw/appdata.../root/scripts/host/run_root_cmd.jsmit/bin/sh /3rd_rw/appdata/deploy_sshd.sh.deploy_sshd.sh:- kopiert die Binaries nach
/3rd_rw/sshd(nutztdropbear-sftpund installiertsftp-server, falls vorhanden); - erzeugt Host-Key (Ed25519);
- kopiert
/etc/passwd→/3rd_rw/sshd/etc_passwdmit Root-Home/3rd_rw/sshd/homeund bindet sie über/etc/passwd; - mountet devpts auf
/dev/shm/ptsund bindet es über/dev/pts; - setzt
authorized_keys(600),.ssh/Home 700; - startet Dropbear auf
0.0.0.0:22, key-only; - installiert den
HamService-Wrapper; - prüft Prozesse/Port/Log/Host-Key.
- kopiert die Binaries nach
3.3 PTY-Workaround
/dev ist Teil des ro Squashfs (kein devtmpfs); /dev/pts enthält statische Nodes 136,0–4; /dev/ptmx ist c 5,2. mount -t devpts direkt auf /dev/pts scheitert (ro Target).
mkdir -p /dev/shm/pts
mount -t devpts -o mode=620,ptmxmode=666,gid=5 devpts /dev/shm/pts
mount --bind /dev/shm/pts /dev/pts
/dev/ptmxbleibt der statische Node;openptyfunktioniert damit.start_sshd.shmacht das bei jedem Start; derHamService-Wrapper ruft es beim Boot.- Fallback ohne PTY:
ssh -T root@192.168.188.94 'id'.
3.4 Root-Home / authorized_keys
- Root-Home
/basicist ro; Dropbear braucht~/.ssh/authorized_keys. - Lösung:
/etc/passwd-Kopie mitroot:x:0:0:root:/3rd_rw/sshd/home:/bin/shund Bind-Mount über/etc/passwd; die ro Originaldatei bleibt unverändert. authorized_keys: dein Public Key (600, root);.ssh/Home 700.- Kein
/etc/shadow-Eingriff, kein Passwort.
3.5 Host-Key / Verbindung
Host-Key: SHA256:7tFL8xcKAh7+wC/3T5QiutxYMqcBTM7p+P4uEMAOwts
Login: ssh root@192.168.188.94
Beim ersten Mal Fingerprint bestätigen. Der Host-Key bleibt in /3rd_rw/sshd/host_key (rw, reboot-fest).
3.6 SFTP (optional, key-only)
Dropbear hat keinen eigenen sftp-server; der Server exec't den compile-time
SFTPSERVER_PATH (Default /usr/libexec/sftp-server). Der ro Rootfs erlaubt
dort keine Datei. Der finale Ordner liefert deshalb:
../root/tools/pub/sftp-server— statischer OpenSSH-9.9p1-sftp-server (ARM, 635.680 B; kein glibc-2.18-Problem)../root/tools/pub/dropbear-sftp— Dropbear mitSFTPSERVER_PATH=/3rd_rw/sshd/sftp-server../root/sources/openssh-9.9p1.tar.gz+build_sftp_server.sh— Repro-Build../root/scripts/host/install_sftp.sh— Installation/Test/Tausch../root/scripts/tv/{install_sftp_stage.sh,enable_sftp.sh,swap_sftp.sh}
Build:
cd /workspace/hisense-he40e5600-root-modding
root/scripts/host/build_sftp_server.sh # OpenSSH sftp-server, static ARM
root/scripts/host/build_dropbear.sh # dropbear + dropbear-sftp
Install (einfachster Weg, vom Host mit deinem SSH-Key):
cd /workspace/hisense-he40e5600-root-modding
root/scripts/host/install_sftp.sh
# optional: TV=root@192.168.188.94 SSH_KEY=~/.ssh/id_ed25519 ...
Ablauf:
- lädt
sftp-server+dropbear-sftpperssh(nicht scp!) nach/3rd_rw/appdata; - startet einen Test-Dropbear auf Port 2222; Port 22 bleibt unangetastet;
- testet
sftp -P 2222(echte SFTP-Session); - nur bei Erfolg: Backup
dropbear.nosftp, Tausch auf Port 22, Neustart; - testet
sftpauf Port 22.
Danach:
sftp root@192.168.188.94
# pwd, ls /3rd_rw/UI, put lokale-datei /3rd_rw/UI/, get /3rd_rw/UI/index.html, bye
Modernes scp (OpenSSH 9+) nutzt ebenfalls SFTP und funktioniert dann:
scp /local/file root@192.168.188.94:/3rd_rw/UI/
Rollback:
ssh root@192.168.188.94 \
'cp -f /3rd_rw/sshd/dropbear.nosftp /3rd_rw/sshd/dropbear; \
kill $(cat /3rd_rw/sshd/dropbear.pid) 2>/dev/null; \
/bin/sh /3rd_rw/sshd/start_sshd.sh'
Sicherheit: SFTP läuft als root, key-only, im LAN; derselbe Zugang wie SSH. Nicht ins Internet exponieren. Der sftp-server ist statisch und hat keine TV-glibc-Abhängigkeit.
4. Deploy-Wege (ohne Package Manager)
| Weg | Wann | Beispiel |
|---|---|---|
File.download (Browser root) |
HTTP-Datei → /3rd_rw/appdata |
HiBrowser.File.download("http://<host>:9000/pub/x","x",1) |
File.write (Browser root) |
Text (Skripte/JSON) → appdata | HiBrowser.File.write("root_cmd.sh","id\n",1) |
| Root-Loop | Kommandos/Deploy als root | root_cmd.sh → root_out.txt |
| SSH + base64 | Binärdateien nach /3rd_rw |
base64 -w0 x | ssh root@TV 'base64 -d > /3rd_rw/bin/x' |
| SSH + tar | mehrere Dateien | tar czf - dir | ssh root@TV 'tar xzf - -C /3rd_rw' |
| USB | Dateien auf ext4-Stick | Symlink/Datei; der TV mountet /mnt/usb/<dev> |
scp/sftp |
nach optionalem SFTP-Install | ../root/scripts/host/install_sftp.sh; dann sftp root@TV / scp datei root@TV:/3rd_rw/... |
File.downloadschreibt Binärdateien byte-exakt; Zielpfad muss in der Whitelist (/3rd_rw/appdata,/dev/shm/shm_tmp,/3rd/launcher/data) oder über den USB-Symlink-Bypass erreichbar sein.File.writeschreibt Text; Binärdaten →EINVAL; für BinärFile.download.- SSH ist key-only;
root;/3rd_rw//data//permrw.
5. Checks / Verifikation
5.1 Host
cd /workspace/hisense-he40e5600-root-modding
sha256sum -c SHA256SUMS
root/scripts/host/build_payload.sh # reproduziert 37b13f…
file root/tools/pub/dropbear # statisch ARM
5.2 TV
/bin/sh /3rd_rw/appdata/verify.sh
# oder:
cat /3rd_rw/root_proof.txt
ps | grep -E 'dropbear|root_loop'
cat /proc/net/tcp | grep :0016
grep '^root:' /etc/passwd
ls -l /3rd_rw/sshd/home/.ssh/authorized_keys
5.3 SSH
ssh root@192.168.188.94 'id; cat /proc/self/status | grep -E "^(Uid|Gid|CapEff):"'
ssh -T root@192.168.188.94 'uname -a' 2>/dev/null || true
uid=0(root);CapEff=0000003fffffffff.- PTY: interaktive Shell;
ssh -Tals Fallback.
5.4 SFTP (nach Install)
printf 'pwd\nls /3rd_rw/UI\nbye\n' | sftp root@192.168.188.94
# auf dem TV:
grep -a 'sftp-server' /3rd_rw/sshd/dropbear
# -> /3rd_rw/sshd/sftp-server
- Wenn
sh: /usr/libexec/sftp-server: No such fileerscheint, ist noch der ungepatchte Dropbear aktiv:root/scripts/host/install_sftp.sh. - Test-Dropbear/Logs:
/3rd_rw/sshd/dropbear2222.log,swap.log,dropbear.log; Backup/3rd_rw/sshd/dropbear.nosftp.
6. Grenzen / Unknowns
- Statisch ist der sichere Weg; dynamische Binaries brauchen die TV-glibc 2.18.
- Kein Package Manager → kein automatisches Dependency-/Update-Handling.
/devro/kein devtmpfs → PTY-Workaround nötig; andere Device-Nodes statisch.- Kein overlayfs → Bind-Mounts; ro-Dateien per
developer.shersetzen. - SFTP ist optional: Dropbear allein hat keinen sftp-server; der statische OpenSSH-sftp-server + gepatchter Dropbear werden per
install_sftp.shinstalliert. Vorherssh+base64/tar/File.download. /3rd/Rootfs 100 % voll; neue Daten nach/3rd_rw//data; kein Flash.- UI-/AM-Interna (
Hisense_*,guijs/TVAPI,app_man,LauncherService) sind nicht vollständig dokumentiert; im DevTools/auf dem TV testen. - DRM/
securetime, Netflix/Cobalt/Amazon, OTA/checker.shsind nicht Teil des Root-/Deploy-Wegs; Deaktivierung testen. - Keine Secrets: kein Root-Hash, kein privater Key in diesem Ordner.