2.6 KiB
2.6 KiB
Skill: File-API & Schreibrechte (HiBrowser.File)
Wo die API läuft
Zwei Root-Webprozesse, beide UID/GID 0, volle CapEff, kein Seccomp:
hisense_browser(Web-Browser, DevTools 9224):--allow-file-access-from-files. Hier läuft unser Recon (recon.html). HatHiBrowser.*,Hisense_*,File.hisenseUI(TV-UI, DevTools 9223):--disable-web-security. Andere Globals (Hisense_*/TVAPI/guijs/model), Signaturen im DevTools prüfen.
Schreib-/Lese-Primitive
| Aufruf | Semantik | Binär? |
|---|---|---|
HiBrowser.File.write(name, text, 1) |
Text schreiben (relativ zu Whitelist-Root) | nein → EINVAL (22) |
HiBrowser.File.download(url, target, 1) |
Datei byte-exakt holen (curl), auch file:// |
ja |
HiBrowser.File.read(rel, flag) / global File.read |
Text lesen | — |
fileXHR("file://<abs>") |
XHR-GET auf file://, liest Datei/Verzeichnis |
Text |
Verzeichnis-Listing: fileXHR("file://<dir>/") liefert HTML mit
addRow(name, size, isDir) → listDir() in recon.html.
Whitelist (IsSubDentry)
Schreiben/Download erlaubt nur relativ zu diesen Präfixen:
/3rd_rw/appdata
/dev/shm/shm_tmp
/3rd/launcher/data
Prüfung: realpath + Präfix-Vergleich, kein Trailing-Slash. Pfad außerhalb
→ Fehler.
Symlink-Bypass (darf überall hin schreiben)
Ein dangling Symlink auf einem ext4-USB-Stick durchbricht die Whitelist:
- TV mountet den Stick als
/mnt/usb/<dev>(JS-Sicht) =/dev/shm/shm_tmp/mnt/usb/<dev>(real). Der Elternpfad liegt in der Whitelist. realpathscheitert am fehlenden Ziel → Prüfung läuft ins Leere, Präfix passt.fopenfolgt dem Symlink und legt die Zieldatei als root überall an.
// plant_payload.js: schreibt libtvsysinfo.so nach /3rd_rw/loglevel/lib/
var usb = "/mnt/usb/sda1";
var target = "so/../../../../dev/shm/shm_tmp" + usb + "/tvi"; // tvi -> /3rd_rw/loglevel/lib/libtvsysinfo.so
HiBrowser.File.download(location.origin + "/pub/libtvsysinfo.so", target, 1);
Bedingungen:
- ext4, nicht FAT32 (keine Symlinks). Kernel 3.18:
mkfs.ext4 -O ^64bit,^metadata_csum, MBR + Partition (kein Superfloppy). - Symlink muss dangling bleiben (Ziel existiert noch nicht).
Fallstricke
File.writemit Binärdaten →EINVAL. Binär immerFile.download.HiBrowser.loadLibrarylädt nichts (Dead End) — nicht als API verwenden.UNVERIFIED: exakteHisense_*-Signaturen der UI;File.read-Flag-Semantik je Prozess.
Siehe: ../modding/03-ui.md, ../modding/06-toolchain-deploy.md, ../dead-ends.md.