Files
hisense-root/skills/fileapi-permissions.md
T
2026-10-27 15:56:27 +01:00

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). Hat HiBrowser.*, 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.

Ein dangling Symlink auf einem ext4-USB-Stick durchbricht die Whitelist:

  1. TV mountet den Stick als /mnt/usb/<dev> (JS-Sicht) = /dev/shm/shm_tmp/mnt/usb/<dev> (real). Der Elternpfad liegt in der Whitelist.
  2. realpath scheitert am fehlenden Ziel → Prüfung läuft ins Leere, Präfix passt.
  3. fopen folgt 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.write mit Binärdaten → EINVAL. Binär immer File.download.
  • HiBrowser.loadLibrary lädt nichts (Dead End) — nicht als API verwenden.
  • UNVERIFIED: exakte Hisense_*-Signaturen der UI; File.read-Flag-Semantik je Prozess.

Siehe: ../modding/03-ui.md, ../modding/06-toolchain-deploy.md, ../dead-ends.md.